0Pricing
Scala for Backend Engineering & Functional Programming · Pelajaran

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 Quotes dan Expr[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

  1. Method Inline
  2. Dasar-Dasar Makro
  3. Quote dan Splice
  4. Makro Praktis
← Kembali ke Scala for Backend Engineering & Functional Programming