let
يُسمّى let لأنه يعكس أصوله الرياضية في إدخال روابط مؤقتة، كما في «Let ( x = 2 ) and ( y = 3 )».
عبارة let في Scheme بنية ربط تُستخدم لتعريف متغيرات ضمن نطاق محلي. تتيح إنشاء روابط مؤقتة ثم تنفيذ كتلة تعليمات برمجية باستخدامها. هذا مفيد للحفاظ على نمطية التعليمات البرمجية وتجنّب تلويث المتغيرات العامة.
هناك ثلاثة أشكال رئيسية لـ let في Scheme:
let: المعيار؛ ينشئ روابط محلية بسيطة.let*: تسلسلي؛ يمكن أن تعتمد الروابط على نتائج روابط سابقة.named let: نموذج خاص ينشئ حلقات عودية أو إجراءات مُسمّاة.
في أبسط أشكاله، ينشئ let روابط متغيرة محلية ويقيّم تعبيرًا بهذه الروابط.
(let ((variable1 value1)
(variable2 value2))
expression)- الروابط: قائمة أزواج يُسند فيها
valueإلىvariable. - التعبير: نص
letالذي يستخدم المتغيرات المحلية.
مثال
(let ((x 10)
(y 20))
(+ x y))- يعرّف متغيرين محليين:
x(10) وy(20). - ثم يحسب
(+ x y).
النتيجة: 30
let*
تشبه let* بنية let، لكن تُقيَّم الروابط بالتسلسل. يمكن أن تعتمد الروابط اللاحقة على السابقة.
(let* ((variable1 value1)
(variable2 expression-using-variable1))
expression)مثال
(let* ((x 10)
(y (+ x 5)))
(* x y))- الربط الأول يعيّن
10إلىx. - الثاني يحسب
yكـ(+ x 5). - النص يحسب
(* x y).
النتيجة: 150
named let
named let نموذج خاص يمنح كتلة let اسمًا، فيحوّلها إلى إجراء عودي. مفيد للحلقات أو الحسابات العودية.
(let name ((variable1 initial-value1)
(variable2 initial-value2))
body-expression)- name: اسم تُعطى له كتلة
let، فيُعرَّف إجراء بفعالية. - الروابط: القيم الأولية للمتغيرات، كما في
letالمعياري. - body: يمكن أن يستدعي
named letنفسه عوديًا.
مثال: التكرار بـ named let
(let loop ((n 5)
(result 1))
(if (= n 0)
result
(loop (- n 1) (* result n))))- تبدأ
loopبـn = 5وresult = 1. - إذا
nيساوي0، تُرجعresult. - وإلا تستدعي نفسها بـ
n - 1وresult * n.
النتيجة: 120 (5!)
جدول ملخص
| البنية | الوصف | حالة الاستخدام |
|---|---|---|
let | يحدّد روابط محلية للمتغيرات. | عندما تكون جميع الروابط مستقلة. |
let* | يحدّد روابط محلية تسلسلية. | عندما تعتمد روابط لاحقة على سابقة. |
named let | يحدّد إجراءات عودية محلية. | للحلقات أو الحسابات العودية في سياق محلي. |
أمثلة
استخدام let لحساب محلي
(let ((x 2)
(y 3))
(+ (* x x) (* y y)))النتيجة: 13 (حساب x² + y²)
استخدام let* لتبعيات تسلسلية
(let* ((x 2)
(y (* x x))
(z (* y x)))
z)النتيجة: 8 (حساب x³)
استخدام named let لحسابات عودية
(let factorial ((n 5)
(result 1))
(if (= n 0)
result
(factorial (- n 1) (* result n))))النتيجة: 120 (5!)
باستخدام let وlet* وnamed let، يُمكّن Scheme البرمجة المعيارية والعودية والتسلسلية بقواعد نطاق واضحة.