Pratik Makrolar
Kullanım alanları
Pratik Makrolar, CoddyKit'te ücretsiz bir Scala for Backend Engineering & Functional Programming dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Scala for Backend Engineering & Functional Programming öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Scala for Backend Engineering & Functional Programming kursu toplamda 4 dersten oluşur.
Gerçek Dünyada Makrolar
Basit örneklerin ötesinde makrolar; kaynak bağlamını yakalama, tür sınıflarını türetme, sabit değerleri doğrulama ve kalıp kod içermeyen kod oluşturma gibi somut sorunları çözer.
Kullanım Örneği: İletili assert
Bir makro, başarısız olan koşulun kaynak metnini yakalayarak otomatik olarak yararlı bir doğrulama iletisi oluşturabilir.
import scala.quoted.*
inline def myAssert(inline cond: Boolean): Unit =
${ assertImpl('cond) }Kaynak Kodu Yakalama
Makronun içinde cond.show (reflect API'si aracılığıyla), ifadenin kaynak kodundaki hâlini verir; siz de bunu hata iletisine eklersiniz.
import scala.quoted.*
def assertImpl(cond: Expr[Boolean])(using q: Quotes): Expr[Unit] = {
import q.reflect.*
val src = Expr(cond.asTerm.show)
'{ if (!${ cond }) throw new AssertionError("failed: " + ${ src }) }
}Kullanım Örneği: Derleme Zamanında Doğrulama
Geçersiz değerlerin çalışma zamanına ulaşmaması için bir sabit değeri (örneğin bir normal ifade veya bağlantı noktası numarası) derleme zamanında doğrulayın.
import scala.quoted.*
inline def port(inline n: Int): Int = ${ portImpl('n) }Geçersiz Girdide İşlemi Durdurma
Sabit değeri çıkarın, denetleyin ve geçersiz değerler için report.errorAndAbort çağrısı yapın; böylece çalışma zamanı hatasını bir derleme hatasına dönüştürün.
import scala.quoted.*
def portImpl(n: Expr[Int])(using q: Quotes): Expr[Int] = {
import q.reflect.*
val v = n.valueOrAbort
if (v < 1 || v > 65535) report.errorAndAbort("invalid port")
n
}Kullanım Örneği: Tür Sınıfı Türetme
Makrolar (çoğunlukla inline + scala.deriving.Mirror aracılığıyla), herhangi bir durum sınıfı için JSON kodlayıcıları gibi tür sınıfı örneklerini kalıp kod olmadan oluşturabilir.
import scala.deriving.Mirror
trait Show[T] { def show(t: T): String }
inline def derived[T](using Mirror.Of[T]): Show[T] = ???Mirror Kullanımı
Bir Mirror, bir ürün türünün alan türlerini ve etiketlerini derleme zamanında sunar. inline ile birleştirildiğinde, bir örnek oluşturmak için alanlar üzerinde yineleme yapabilirsiniz.
import scala.deriving.*
import scala.compiletime.*
inline def labels[T](using m: Mirror.ProductOf[T]): List[String] =
constValueTuple[m.MirroredElemLabels].toList.map(_.toString)Kullanım Örneği: Konumla Günlük Kaydı
Bir makro, çalışma zamanı maliyeti olmadan günlük iletilerine dosya ve satır numarası eklemek için reflect API'sindeki Position değerini okuyabilir.
import scala.quoted.*
def posImpl(using q: Quotes): Expr[String] = {
import q.reflect.*
val p = Position.ofMacroExpansion
Expr(s"${p.sourceFile.name}:${p.startLine + 1}")
}Makrolar Ne Zaman KULLANILMAMALI
Makrolar güçlüdür; ancak bakımını yapmak ve hatalarını ayıklamak maliyetlidir. Önce sıradan işlevleri, inline yöntemlerini veya given türetmesini tercih edin. Makrolara yalnızca bunlar gereksinimi ifade edemediğinde başvurun.
Makroları Sınama
Oluşturulan davranışı sıradan kod gibi sınayın; ayrıca typeCheckErrors gibi derleme zamanı sınama araçlarını kullanarak geçersiz girdilerin derlenemediğini sınayın.
Çalışma Zamanındaki Karşılığı
Derleme zamanı doğrulama makrosu, bu kendi kendine yeten çalışma zamanı denetimiyle aynı etkiyi oluşturur; ancak hata çalışma zamanında değil, derleme sırasında meydana gelir.
object Main {
def port(n: Int): Int = {
require(n >= 1 && n <= 65535, "invalid port")
n
}
def main(args: Array[String]): Unit = {
println(port(8080)) // 8080
}
}Hızlı Kontrol
Bir sabit değeri çalışma zamanı yerine makroyla doğrulamanın temel avantajı nedir?
Özet
Pratik makro kullanım alanlarını incelediniz:
- kaynak yakalayan
assert errorAndAbortile derleme zamanı doğrulamasıMirroraracılığıyla tür sınıfı türetme- konum bilgisine duyarlı günlük kaydı
- makrolardan ne zaman kaçınılacağı ve bunların nasıl sınanacağı
Metaprogramlama ve Makrolar kursunu tamamladınız.
Sıkça Sorulan Sorular
“Pratik Makrolar” dersi ücretsiz mi?
Evet — “Pratik Makrolar” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Scala for Backend Engineering & Functional Programming kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Scala for Backend Engineering & Functional Programming kursu toplamda 4 dersten oluşur.
“Pratik Makrolar” dersinde ne öğreneceğim?
Kullanım alanları Scala for Backend Engineering & Functional Programming ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Scala for Backend Engineering & Functional Programming öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Scala for Backend Engineering & Functional Programming, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Pratik Makrolar” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Scala for Backend Engineering & Functional Programming dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Scala for Backend Engineering & Functional Programming dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Satır İçi Yöntemler
- Makro Temelleri
- Alıntılar ve Eklemeler
- Pratik Makrolar