Dasar-Dasar Makro
Kode saat kompilasi.
Dasar-Dasar Makro adalah pelajaran Scala for Backend Engineering & Functional Programming gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Scala for Backend Engineering & Functional Programming, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Scala for Backend Engineering & Functional Programming mencakup 4 pelajaran total.
Apa Itu Makro?
Makro adalah kode yang berjalan saat waktu kompilasi untuk menghasilkan kode lain. Makro Scala 3 memungkinkan Anda memeriksa argumen, membangun ekspresi, dan menyisipkannya ke dalam program sebelum program dikompilasi.
Pola Inline + Makro
Makro dipanggil dari inline def yang mendelegasikan pekerjaan kepada metode yang ditandai dengan ${ ... }. Inline def merupakan API publik; implementasi makro berjalan di dalam kompiler.
import scala.quoted.*
inline def power(x: Double, inline n: Int): Double =
${ powerImpl('x, 'n) }Konteks Quotes
Setiap implementasi makro menerima konteks implisit Quotes. Konteks ini memberikan akses ke API refleksi serta kemampuan untuk membangun dan menyisipkan ekspresi.
import scala.quoted.*
def powerImpl(x: Expr[Double], n: Expr[Int])(using Quotes): Expr[Double] =
???Expr[T]
Expr[T] merepresentasikan ekspresi bertipe dengan tipe T sebagai data waktu kompilasi. Makro menerima dan mengembalikan nilai Expr.
Mengangkat Nilai Menjadi Expr
Expr(value) mengangkat nilai waktu proses yang dihitung dalam makro menjadi ekspresi untuk disisipkan kembali. Ini berfungsi untuk tipe apa pun yang memiliki instans ToExpr.
import scala.quoted.*
def constImpl(using Quotes): Expr[Int] = Expr(42)Mengekstrak Argumen Konstanta
n.value (atau n.valueOrAbort) mengekstrak konstanta di balik Expr ketika argumen diketahui secara statis, sehingga makro dapat melakukan percabangan berdasarkan nilai tersebut.
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
}Melaporkan Kesalahan
Gunakan quotes.reflect.report.errorAndAbort untuk menghasilkan kesalahan kompilasi dengan pesan dan lokasi ketika prasyarat makro tidak terpenuhi.
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)
}Tempat Makro Berada
Implementasi makro harus dikompilasi sebelum kode yang menggunakannya — biasanya dalam file atau modul terpisah. Kompiler menjalankannya saat mengompilasi pemanggil.
Kasus Penggunaan Umum
Makro mendukung:
- derivasi kelas tipe (penyandi JSON, dan sebagainya)
- validasi saat kompilasi (regex, SQL)
- pencatatan yang merekam posisi sumber
- abstraksi tanpa biaya
Keamanan dan Higienitas
Makro Scala 3 bersifat higienis: pengenal yang dihasilkan tidak dapat secara tidak sengaja menangkap variabel pengguna, dan sistem tipe memeriksa kode yang dihasilkan sehingga mencegah banyak kesalahan makro klasik.
Padanan Waktu Proses
Makro yang menghitung pangkat saat kompilasi menghasilkan hasil yang sama seperti versi waktu proses mandiri ini — tetapi perkaliannya telah ditanamkan oleh kompiler.
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
}
}Pemeriksaan Singkat
Tipe apa yang merepresentasikan ekspresi bertipe waktu kompilasi yang diterima dan dikembalikan oleh makro?
Rangkuman
Anda telah mempelajari dasar-dasar makro:
- makro berjalan saat kompilasi melalui pola
inline def ... ${ } - konteks
QuotesdanExpr[T] - pengangkatan dengan
Expr(...)dan ekstraksi dengan.value - pelaporan kesalahan dan higienitas
Berikutnya: quotes dan splice.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Dasar-Dasar Makro” gratis?
Ya — teks lengkap “Dasar-Dasar Makro” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Scala for Backend Engineering & Functional Programming, upgrade ke CoddyKit PRO. Kursus Scala for Backend Engineering & Functional Programming mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Dasar-Dasar Makro”?
Kode saat kompilasi. Kamu berlatih Scala for Backend Engineering & Functional Programming dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Scala for Backend Engineering & Functional Programming?
Tidak diperlukan pengalaman sebelumnya. Scala for Backend Engineering & Functional Programming di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “Dasar-Dasar Makro” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Scala for Backend Engineering & Functional Programming ini?
Ya. Setiap pelajaran Scala for Backend Engineering & Functional Programming menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Method Inline
- Dasar-Dasar Makro
- Quote dan Splice
- Makro Praktis