0Pricing
Scala for Backend Engineering & Functional Programming · Ders

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
  • errorAndAbort ile derleme zamanı doğrulaması
  • Mirror aracı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

  1. Satır İçi Yöntemler
  2. Makro Temelleri
  3. Alıntılar ve Eklemeler
  4. Pratik Makrolar
← Scala for Backend Engineering & Functional Programming Sayfasına Dön