Scala voor backend-engineering en functioneel programmeren · Les

De basis van macro's

Code tijdens het compileren

Les 2 van 413 stappen

De basis van macro's is een gratis Scala voor backend-engineering en functioneel programmeren-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Scala voor backend-engineering en functioneel programmeren. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Scala voor backend-engineering en functioneel programmeren bevat in totaal 4 lessen.

Wat is een macro?

Een macro is code die tijdens het compileren wordt uitgevoerd om andere code te genereren. Met Scala 3-macro's kun je argumenten inspecteren, expressies opbouwen en deze vóór het compileren in het programma invoegen.

Patroon voor inline + macro

Een macro wordt aangeroepen vanuit een inline def die doorstuurt naar een methode die met ${ ... } is gemarkeerd. De inline def is de openbare API; de macro-implementatie wordt in de compiler uitgevoerd.

import scala.quoted.*

inline def power(x: Double, inline n: Int): Double =
  ${ powerImpl('x, 'n) }

De context Quotes

Elke macro-implementatie ontvangt een impliciete Quotes-context. Deze geeft toegang tot de reflectie-API en de mogelijkheid om expressies op te bouwen en in te voegen.

import scala.quoted.*

def powerImpl(x: Expr[Double], n: Expr[Int])(using Quotes): Expr[Double] =
  ???

Expr[T]

Expr[T] stelt een getypeerde expressie van type T voor als gegevens tijdens het compileren. Macro's ontvangen en retourneren Expr-waarden.

Waarden naar Expr tillen

Expr(value) tilt een runtimewaarde die in de macro is berekend naar een expressie om deze weer in te voegen. Dit werkt voor elk type met een ToExpr-instantie.

import scala.quoted.*

def constImpl(using Quotes): Expr[Int] = Expr(42)

Constante argumenten extraheren

n.value (of n.valueOrAbort) haalt de constante achter een Expr op wanneer het argument statisch bekend is, zodat de macro op basis daarvan kan vertakken.

import scala.quoted.*

def powerImpl(x: Expr[Double], n: Expr[Int])(using Quotes): Expr[Double] = {
  val exp = n.valueOrAbort
  ??? // build x*x*...*x exp times
}

Fouten melden

Gebruik quotes.reflect.report.errorAndAbort om een compileerfout met een bericht en locatie te melden wanneer niet aan de voorwaarden van de macro is voldaan.

import scala.quoted.*

def check(n: Expr[Int])(using q: Quotes): Expr[Int] = {
  import q.reflect.*
  val v = n.valueOrAbort
  if (v < 0) report.errorAndAbort("must be >= 0")
  Expr(v)
}

Waar macro's staan

Macro-implementaties moeten vóór de code die ze gebruikt wordt gecompileerd — meestal in een afzonderlijk bestand of een afzonderlijke module. De compiler voert ze uit tijdens het compileren van de aanroeper.

Veelvoorkomende toepassingen

Macro's maken het volgende mogelijk:

  • afleiding van typeklassen (JSON-codecs enzovoort)
  • validatie tijdens het compileren (regex, SQL)
  • logboekregistratie die bronposities vastlegt
  • abstracties zonder runtimekosten

Veiligheid en hygiëne

Scala 3-macro's zijn hygiënisch: gegenereerde identifiers kunnen niet per ongeluk variabelen van de gebruiker onderscheppen en het typesysteem controleert gegenereerde code, waardoor veel klassieke macrofouten worden voorkomen.

Runtime-equivalent

Een macro die tijdens het compileren een macht berekent, levert hetzelfde resultaat op als deze zelfstandige runtimeversie — maar de vermenigvuldigingen zijn door de compiler vooraf in de code opgenomen.

object Main {
  def power(x: Double, n: Int): Double =
    if (n == 0) 1.0 else x * power(x, n - 1)
  def main(args: Array[String]): Unit = {
    println(power(2.0, 3)) // 8.0
  }
}

Korte controle

Welk type stelt een getypeerde expressie tijdens het compileren voor die macro's ontvangen en retourneren?

Samenvatting

Je hebt de basis van macro's geleerd:

  • macro's worden tijdens het compileren uitgevoerd via het patroon inline def ... ${ }
  • de context Quotes en Expr[T]
  • waarden tillen met Expr(...) en extraheren met .value
  • foutrapportage en hygiëne

Volgende: quotes en splices.

Gratis beginnen

Leer Scala met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
39
Lessen
143

Veelgestelde vragen

Is de les “De basis van macro's” gratis?

Ja — de volledige tekst van “De basis van macro's” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Scala voor backend-engineering en functioneel programmeren wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Scala voor backend-engineering en functioneel programmeren bevat in totaal 4 lessen.

Wat leer ik in “De basis van macro's”?

Code tijdens het compileren Je oefent met Scala voor backend-engineering en functioneel programmeren door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Scala voor backend-engineering en functioneel programmeren te beginnen?

Ervaring vooraf is niet nodig. Scala voor backend-engineering en functioneel programmeren op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.

Hoe lang duurt de les “De basis van macro's”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Scala voor backend-engineering en functioneel programmeren?

Ja. Elke les over Scala voor backend-engineering en functioneel programmeren bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Inline-methoden
  2. De basis van macro's
  3. Quotes en splices
  4. Praktische macro's
← Terug naar Scala voor backend-engineering en functioneel programmeren