Grunnleggende makroer
Kode ved kompilering
Grunnleggende makroer er en gratis leksjon i Scala for backendutvikling og funksjonell programmering på CoddyKit. Dette er leksjon 2 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Scala for backendutvikling og funksjonell programmering, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Scala for backendutvikling og funksjonell programmering inneholder totalt 4 leksjoner.
Hva er en makro?
En makro er kode som kjører under kompileringen for å generere annen kode. Scala 3-makroer lar deg inspisere argumenter, bygge uttrykk og sette dem inn i programmet før det kompileres.
Mønsteret inline + makro
En makro kalles fra en inline def som delegerer til en metode merket med ${ ... }. Inline-definisjonen er det offentlige API-et; makroimplementasjonen kjører i kompilatoren.
import scala.quoted.*
inline def power(x: Double, inline n: Int): Double =
${ powerImpl('x, 'n) }Quotes-konteksten
Alle makroimplementasjoner tar en implisitt Quotes-kontekst. Den gir tilgang til refleksjons-API-et og muligheten til å bygge og sette inn uttrykk.
import scala.quoted.*
def powerImpl(x: Expr[Double], n: Expr[Int])(using Quotes): Expr[Double] =
???Expr[T]
Expr[T] representerer et typet uttrykk av typen T som data kjent under kompileringen. Makroer mottar og returnerer Expr-verdier.
Løfte verdier til Expr
Expr(value) løfter en kjøretidsverdi som er beregnet i makroen, til et uttrykk som kan settes inn igjen. Dette fungerer for alle typer som har en ToExpr-instans.
import scala.quoted.*
def constImpl(using Quotes): Expr[Int] = Expr(42)Hente ut konstante argumenter
n.value (eller n.valueOrAbort) henter ut konstanten bak en Expr når argumentet er statisk kjent, slik at makroen kan velge gren basert på 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
}Rapportere feil
Bruk quotes.reflect.report.errorAndAbort for å generere en kompileringsfeil med melding og plassering når makroens forutsetninger ikke er oppfylt.
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)
}Hvor makroer lever
Makroimplementasjoner må kompileres før koden som bruker dem — vanligvis i en separat fil eller modul. Kompilatoren kjører dem mens den kompilerer kallstedet.
Vanlige bruksområder
Makroer brukes til:
- derivasjon av typeklasser (JSON-kodeker og lignende)
- validering under kompilering (regex, SQL)
- logging som registrerer kildekodeposisjoner
- kostnadsfrie abstraksjoner
Sikkerhet og hygiene
Scala 3-makroer er hygieniske: genererte identifikatorer kan ikke utilsiktet fange opp brukerens variabler, og typesystemet kontrollerer den genererte koden. Dette forhindrer mange klassiske makrofeil.
Tilsvarende kjøretidsversjon
En makro som beregner en potens, produserer samme resultat som denne selvstendige kjøretidsversjonen — men med multiplikasjonene bakt inn av kompilatoren.
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
}
}Rask kontroll
Hvilken type representerer et typet uttrykk kjent under kompileringen som makroer mottar og returnerer?
Oppsummering
Du har lært det grunnleggende om makroer:
- makroer kjører under kompileringen via mønsteret
inline def ... ${ } Quotes-kontekst ogExpr[T]- løfting med
Expr(...)og uthenting med.value - feilrapportering og hygiene
Neste: quotes og splices.
Lær deg Scala med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 39
- Leksjoner
- 143
Ofte stilte spørsmål
Er leksjonen «Grunnleggende makroer» gratis?
Ja – hele teksten i «Grunnleggende makroer» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Scala for backendutvikling og funksjonell programmering-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Scala for backendutvikling og funksjonell programmering inneholder totalt 4 leksjoner.
Hva lærer jeg i «Grunnleggende makroer»?
Kode ved kompilering Du øver på Scala for backendutvikling og funksjonell programmering med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Scala for backendutvikling og funksjonell programmering?
Ingen tidligere erfaring er nødvendig. Scala for backendutvikling og funksjonell programmering på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.
Hvor lang tid tar leksjonen «Grunnleggende makroer»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Scala for backendutvikling og funksjonell programmering-leksjonen?
Ja. Alle Scala for backendutvikling og funksjonell programmering-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Inline-metoder
- Grunnleggende makroer
- Quotes og splices
- Praktiske makroer