0Pricing
Scala for Backend Engineering & Functional Programming · Pelajaran

Quote dan Splice

Kode sebagai data.

Quote dan Splice adalah pelajaran Scala for Backend Engineering & Functional Programming gratis di CoddyKit. Ini adalah pelajaran 3 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.

Kode sebagai Data

Metaprogramming Scala 3 memperlakukan kode sebagai data. Sebuah kutipan menangkap sebagian kode sebagai Expr, sedangkan penyisipan memasukkan kembali Expr ke dalam kode.

Kutipan: '{ ... }

'{ expr } mengubah sebuah ekspresi menjadi Expr[T]. Kode tersebut tidak dijalankan—kode itu menjadi nilai yang dapat dimanipulasi makro.

import scala.quoted.*

def greeting(using Quotes): Expr[String] = '{ "Hello, " + "world" }

Penyisipan: ${ ... }

${ expr } memasukkan Expr ke dalam kutipan yang mengelilinginya, sehingga fragmen-fragmen yang dihasilkan tersusun menjadi satu. Kutipan dan penyisipan merupakan operasi invers.

import scala.quoted.*

def doubled(x: Expr[Int])(using Quotes): Expr[Int] = '{ ${ x } * 2 }

Menyisipkan Nilai yang Diangkat

Di dalam kutipan, Anda dapat menyisipkan nilai yang diangkat dengan Expr(...) untuk menyematkan konstanta waktu kompilasi ke dalam kode yang dihasilkan.

import scala.quoted.*

def addN(x: Expr[Int], n: Int)(using Quotes): Expr[Int] =
  '{ ${ x } + ${ Expr(n) } }

Membangun Kode Secara Rekursif

Makro membangun ekspresi kompleks dengan menggabungkan kutipan dan penyisipan dalam perulangan atau rekursi—misalnya menguraikan perpangkatan menjadi perkalian berulang.

import scala.quoted.*

def pow(x: Expr[Double], n: Int)(using Quotes): Expr[Double] =
  if (n == 0) '{ 1.0 } else '{ ${ x } * ${ pow(x, n - 1) } }

Pencocokan Pola pada Kutipan

Anda dapat menguraikan kode dengan mencocokkannya dengan pola kutipan. Cara ini memeriksa bentuk sebuah ekspresi untuk mengoptimalkan atau menulis ulang ekspresi tersebut.

import scala.quoted.*

def optimize(e: Expr[Int])(using Quotes): Expr[Int] = e match {
  case '{ ($a: Int) + 0 } => a
  case _                  => e
}

Type[T] dan Tipe yang Dikutip

Sama seperti Expr[T] yang membawa sebuah ekspresi, Type[T] membawa sebuah tipe. Gunakan '[T] untuk mengutip tipe dan given Type[T] untuk menyisipkannya di tempat yang memerlukan tipe.

import scala.quoted.*

def typeName[T](using t: Type[T], q: Quotes): Expr[String] =
  Expr(Type.show[T])

API reflect

Untuk pekerjaan tingkat rendah, quotes.reflect menyediakan pohon sintaks abstrak (Term, Symbol, TypeRepr) sehingga Anda dapat memeriksa atau membangun kode di luar hal yang dapat diungkapkan langsung oleh kutipan.

import scala.quoted.*

def show(e: Expr[Any])(using q: Quotes): Expr[String] = {
  import q.reflect.*
  Expr(e.asTerm.show)
}

Bolak-Balik Antarlevel

Ubah Expr menjadi Term dengan asTerm, lalu kembalikan dengan asExpr / asExprOf[T]. Ini menjembatani API kutipan tingkat tinggi dan API refleksi.

import scala.quoted.*

def ident[T: Type](e: Expr[T])(using q: Quotes): Expr[T] = {
  import q.reflect.*
  e.asTerm.asExprOf[T]
}

Padanan Saat Runtime

Makro perpangkatan rekursif di atas diperluas menjadi perkalian biasa. Versi runtime mandiri ini menunjukkan hasil yang sama dengan yang akan dihasilkan oleh kode tersebut.

object Main {
  def pow(x: Double, n: Int): Double =
    if (n == 0) 1.0 else x * pow(x, n - 1)
  def main(args: Array[String]): Unit = {
    println(pow(3.0, 2)) // 9.0
  }
}

Kutipan dan Penyisipan Merupakan Operasi Invers

Ingat dualitasnya: '{ } mengangkat kode menjadi Expr; ${ } menurunkan Expr kembali menjadi kode. Menyusunnya secara tepat merupakan inti dari pembangunan makro.

Pemeriksaan Singkat

Apa yang dilakukan operator penyisipan ${ x } di dalam kutipan?

Ringkasan

Anda telah mempelajari kutipan dan penyisipan:

  • '{ } mengutip kode menjadi Expr[T]
  • ${ } menyisipkan Expr ke dalam kode
  • pencocokan pola kutipan untuk menguraikan kode
  • Type[T] dan API reflect

Selanjutnya: makro praktis.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Quote dan Splice” gratis?

Ya — teks lengkap “Quote dan Splice” 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 “Quote dan Splice”?

Kode sebagai data. 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 3 dari 4.

Berapa lama pelajaran “Quote dan Splice” 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