سؤال

أود الحصول على نسخة من 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top