Scala för backendutveckling och funktionell programmering · Lektion

Grunderna i makron

Kod vid kompilering.

Lektion 2 av 413 steg

Grunderna i makron är en gratis lektion i Scala för backendutveckling och funktionell programmering på CoddyKit. Detta är lektion 2 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Scala för backendutveckling och funktionell programmering, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Scala för backendutveckling och funktionell programmering innehåller totalt 4 lektioner.

Vad är ett makro?

Ett makro är kod som körs vid kompilering för att generera annan kod. Med makron i Scala 3 kan ni inspektera argument, bygga uttryck och infoga dem i programmet innan det kompileras.

Mönstret inline + makro

Ett makro anropas från en inline def som delegerar till en metod markerad med ${ ... }. Inline-def:en är det publika API:et; makroimplementeringen körs i kompilatorn.

import scala.quoted.*

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

Quotes-kontexten

Varje makroimplementering tar en implicit Quotes-kontext. Den ger åtkomst till reflektions-API:et samt möjlighet att bygga och infoga uttryck.

import scala.quoted.*

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

Expr[T]

Expr[T] representerar ett typat uttryck av typen T som data vid kompilering. Makron tar emot och returnerar värden av typen Expr.

Lyfta värden till Expr

Expr(value) lyfter ett körningsvärde som beräknats i makrot till ett uttryck som kan infogas igen. Det fungerar för alla typer som har en ToExpr-instans.

import scala.quoted.*

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

Extrahera konstanta argument

n.value (eller n.valueOrAbort) extraherar konstanten bakom ett Expr när argumentet är statiskt känt, så att makrot kan förgrena sig utifrån den.

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
}

Rapportera fel

Använd quotes.reflect.report.errorAndAbort för att rapportera ett kompileringsfel med meddelande och plats när makrots förvillkor inte är uppfyllda.

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)
}

Var makron finns

Makroimplementeringar måste kompileras före koden som använder dem — vanligtvis i en separat fil eller modul. Kompilatorn kör dem när anroparen kompileras.

Vanliga användningsområden

Makron används för:

  • typeclass-härledning (JSON-kodare med mera)
  • validering vid kompilering (regex, SQL)
  • loggning som fångar källkodspositioner
  • kostnadsfria abstraktioner

Säkerhet och hygien

Makron i Scala 3 är hygieniska: genererade identifierare kan inte oavsiktligt fånga användarvariabler, och typsystemet kontrollerar den genererade koden, vilket förhindrar många klassiska makrobuggar.

Motsvarighet vid körning

Ett makro som beräknar en potens vid kompilering ger samma resultat som denna fristående version vid körning — men med multiplikationerna inbyggda av kompilatorn.

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
  }
}

Snabb kontroll

Vilken typ representerar ett typat uttryck vid kompilering som makron tar emot och returnerar?

Sammanfattning

Ni har lärt er grunderna i makron:

  • makron körs vid kompilering via mönstret inline def ... ${ }
  • Quotes-kontext och Expr[T]
  • lyftning med Expr(...) och extrahering med .value
  • felrapportering och hygien

Nästa: quotes och splices.

Gratis att börja

Lär dig Scala med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
39
Lektioner
143

Vanliga frågor

Är lektionen ”Grunderna i makron” gratis?

Ja – hela texten till ”Grunderna i makron” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Scala för backendutveckling och funktionell programmering, kan Ni uppgradera till CoddyKit PRO. Kursen i Scala för backendutveckling och funktionell programmering innehåller totalt 4 lektioner.

Vad lär jag mig i ”Grunderna i makron”?

Kod vid kompilering. Ni övar på Scala för backendutveckling och funktionell programmering med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Scala för backendutveckling och funktionell programmering?

Du behöver inga förkunskaper. Utbildningen i Scala för backendutveckling och funktionell programmering på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.

Hur lång tid tar lektionen ”Grunderna i makron”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Scala för backendutveckling och funktionell programmering-lektionen?

Ja. Varje Scala för backendutveckling och funktionell programmering-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Inline-metoder
  2. Grunderna i makron
  3. Quotes och splices
  4. Praktiska makron
← Tillbaka till Scala för backendutveckling och funktionell programmering