0Pricing
Scala for Backend Engineering & Functional Programming · درس

الاقتباسات والدمج

الشيفرة كبيانات

الاقتباسات والدمج درس مجاني في Scala for Backend Engineering & Functional Programming على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Scala for Backend Engineering & Functional Programming، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.

الشفرة بوصفها بيانات

تتعامل البرمجة الوصفية في Scala 3 مع الكود على أنه بيانات. يلتقط الاقتباس جزءًا من الكود في Expr، بينما تُدرج العملية splice قيمة Expr مرة أخرى داخل الكود.

الاقتباس: '{ ... }'

تحوّل '{ expr } تعبيرًا إلى Expr[T]. لا يُنفَّذ الكود، بل يصبح قيمة يمكن للماكرو معالجتها.

import scala.quoted.*

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

الإدراج: ${ ... }

تُدرج ${ expr } قيمة Expr داخل اقتباس محيط، فتجمع الأجزاء المُولَّدة معًا. الاقتباس والإدراج عمليتان عكسيتان.

import scala.quoted.*

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

إدراج القيم المرفوعة

داخل الاقتباس، يمكنك إدراج قيمة رُفعت باستخدام Expr(...) لتضمين ثابت وقت الترجمة في الكود المُولَّد.

import scala.quoted.*

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

إنشاء الكود بشكل递归ي

تنشئ الماكروهات تعبيرات معقدة بدمج الاقتباسات وعمليات الإدراج داخل الحلقات أو الاستدعاء الذاتي، مثل تفكيك القوة إلى عمليات ضرب متكررة.

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) } }

مطابقة الأنماط في الاقتباسات

يمكنك تفكيك الكود بمطابقته مع أنماط الاقتباس. يتيح ذلك فحص بنية التعبير لتحسينه أو إعادة كتابته.

import scala.quoted.*

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

Type[T] والأنواع المقتبسة

كما تحمل Expr[T] تعبيرًا، تحمل Type[T] نوعًا. استخدم '[T] لاقتباس نوع، وgiven Type[T] لإدراجه حيثما يلزم نوع.

import scala.quoted.*

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

واجهة reflect البرمجية

للعمل على مستوى أدنى، تكشف quotes.reflect شجرة البنية المجردة (Term وSymbol وTypeRepr)، بحيث يمكنك فحص الكود أو إنشاؤه بما يتجاوز ما تعبّر عنه الاقتباسات مباشرة.

import scala.quoted.*

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

التحويل ذهابًا وإيابًا بين المستويات

حوّل Expr إلى Term باستخدام asTerm، ثم أعده باستخدام asExpr أو asExprOf[T]. يربط ذلك بين واجهة الاقتباس عالية المستوى وواجهة الانعكاس.

import scala.quoted.*

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

النظير وقت التشغيل

يتوسع ماكرو القوة递归ي أعلاه إلى عمليات ضرب عادية. يوضّح هذا الإصدار المستقل وقت التشغيل النتيجة نفسها التي سينتجها الكود المُولَّد.

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
  }
}

الاقتباس والإدراج عمليتان عكسيتان

تذكّر الازدواجية: ترفع '{ } الكود إلى Expr، بينما تُسقط ${ } قيمة Expr مرة أخرى داخل الكود. ويشكّل تداخلهما بصورة صحيحة جوهر بناء الماكروهات.

تحقق سريع

ماذا يفعل عامل الإدراج ${ x } داخل اقتباس؟

مراجعة

لقد تعلّمت الاقتباسات وعمليات الإدراج:

  • يقتبس '{ } الكود في Expr[T]
  • تُدرج ${ } قيمة Expr داخل الكود
  • مطابقة أنماط الاقتباس لتفكيك الكود
  • Type[T] وواجهة reflect البرمجية

التالي: الماكروهات العملية.

الأسئلة الشائعة

هل درس «الاقتباسات والدمج» مجاني؟

نعم — نص درس «الاقتباسات والدمج» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Scala for Backend Engineering & Functional Programming، انتقل إلى CoddyKit PRO. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.

ماذا ستتعلم في «الاقتباسات والدمج»؟

الشيفرة كبيانات تتمرن على Scala for Backend Engineering & Functional Programming مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Scala for Backend Engineering & Functional Programming؟

لا تُشترط خبرة سابقة. Scala for Backend Engineering & Functional Programming على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «الاقتباسات والدمج»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Scala for Backend Engineering & Functional Programming هذا؟

نعم. كل درس في Scala for Backend Engineering & Functional Programming يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الدوال Inline
  2. أساسيات Macros
  3. الاقتباسات والدمج
  4. Macros عملية
← العودة إلى Scala for Backend Engineering & Functional Programming