سؤال

Jeffrey Meunier لديه ماكرو كاري ضمني هنا, الذي يستخدم defmacro. كنت أتساءل عما إذا كان شخص ما قد كتب هذا من قبل بحكم بناء الجملة؟

هل كانت مفيدة؟

المحلول

هناك عدد من تطبيقات الكاري للمخطط - لا شيء يمكن أن يكون أنيقًا مثل Haskell ، نظرًا لوجود وظائف دائمًا وظائف أحادية ، لذلك يمكن أن يكون كل شيء. (ولكن بالطبع يمكن تنفيذ هذا في مخطط قوي بما فيه الكفاية مضرب تنس.)

أما بالنسبة للماكرو الذي قمت بحفره - إنه أمر سيء للغاية: لا يستخدم فقط ماكرو غير صحي ، بل إنه يتصل أيضًا eval بشكل صريح ، ويعتمد على تنفيذ البيئات وما إلى ذلك ، لكن من السهل القيام بذلك ببسيط syntax-rules دقيق. Afaict ، هذا ما تنفذه:

(define-syntax-rule (clambda (x ... . r) b ...)
  (let ([len  (length '(x ...))] [real (lambda (x ... . r) b ...)])
    (let loop ([argss '()] [n 0])
      (lambda args
        (let ([n (+ n (length args))] [argss (cons args argss)])
          (if (>= n len)
            (apply real (apply append (reverse argss)))
            (loop argss n)))))))

ولكن هناك ملاحظة مهمة هنا. تقول الصفحة التي تشير إليها أن مشكلة إصدار الوظيفة هي أنها صريحة - ولكن لها أيضًا ميزة مهمة: مع تطبيق الماكرو ، يجب تحديد وظيفة باستخدامها clambda, ، في حين يمكن استخدام الإصدار الوظيفي مع أي وظيفة مدمجة. في العديد من تطبيقات المخططات ، هناك مرافق لتفقد Arity للوظيفة ، واستخدام هذا ، من الممكن تنفيذ إصدار وظيفة Currying يعرف متى يتم الاتصال بالوظيفة الأصلية.

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