كيفية جعل مجرد جزء من ماكرو صحية
سؤال
أود الحصول على نسخة من lambda
, ، ودعا lambda-r
, ، من الداخل يمكنك return
.مثال:
(+ ((lambda-r ()
(return 1)
2)) 5)
هذا من شأنه أن يعطي القيمة 6
.على الرغم من أنك قد تتوقع أن تكون القيمة 7 ، إلا أنها 6 لأنه يتم إرجاع 1 من تعبير لامدا قبل الوصول إلى 2.
إليك مثال على نوع التحول الذي أبحث عنه.دعنا نقول واحد كان لاستخدام lambda-r
على النحو التالي:
(lambda-r (a b)
(return a)
(+ a b))
أريد أن تتحول مثل هذا:
(call/cc (lambda (k)
(define return (lambda (v)
(k (lambda (a b)
v))))
(lambda (a b)
(return a)
(+ a b))))
يمكن التعبير عن ذلك أيضا بتعبير السماح بدلا من تعريف داخلي ، لكنني أستخدم التعريف من أجل الوضوح.
لاحظ أن الكود أعلاه يعمل بالفعل كما هو متوقع. المشكلة هو أنني أواجه مشكلة في التعبير lambda-r
كما ماكرو.السبب هو أنني أريد k
و v
أن تكون صحية ، ولكن لا أريد return
أن تكون صحية.
الماكرو الخاص بي في الوقت الحالي هو هذا:
(define-syntax lambda-r
(syntax-rules (return)
[(_ (var ...) body ...)
(call/cc (lambda (k)
(define return (lambda (v)
(k (lambda (var ...)
v))))
(lambda (var ...)
body ...)))
]))
الذي لا يعمل لأن return
يتم علاجه بطريقة صحية ، ونتيجة لذلك لا يكون مرئيا بشكل مباشر عند الاستخدام lambda-r
.لذا (lambda-r () (return 1))
يعطي خطأ يقول ذلك return
ليس معرفا صالحا.
تحرير:بفضل إجابة ناثان ساندرز ، أنا أقرب إلى فهم ما يجب أن أفعله هنا.ومع ذلك أنا لا أفهم تماما الإجراءات التالية ، ونتيجة لذلك لم تكن قادرة على الحصول على هذا العمل حتى الآن.سأكون ممتنا حقا إذا كان بإمكانك شرح / توجيهي إلى الموارد التي تشرح ما يلي:
- ال
syntax
الإجراء - ال
datum->syntax
/syntax->datum
الإجراءات
تحرير:فما باللك-لقد حصلت عليه الآن :)
المحلول
ما تريده هو syntax-case
بدلا من syntax-rules
.
تعريف آر 6 آر إس يعطي بعض الأمثلة ، لا سيما قسم حول تحويلات بناء الجملة والكائن والمسند, ، وهو ما تريد.يجب أن تكون قادرا على تكييف loop
w/ break
مثال على الخاص بك return
.