5

जेफरी मीनियर का एक अंतर्निहित करी मैक्रो here है, जो डिफैक्रो का उपयोग करता है। मैं सोच रहा था कि किसी ने कभी इसे सिंटैक्स-नियमों के साथ लिखा है?वाक्यविन्यास-नियमों के साथ योजना में लागू करीबी?

उत्तर

3

योजना के लिए कई करी क्रियान्वयन हैं - कोई भी हास्केल के रूप में सुरुचिपूर्ण नहीं हो सकता है, क्योंकि वहां कार्य हमेशा असीमित कार्य होते हैं, इसलिए सब कुछ घुमाया जा सकता है। (लेकिन यह निश्चित रूप से Racket जैसी पर्याप्त शक्तिशाली योजना में कार्यान्वित किया जा सकता है।)

मैक्रो के लिए जो आपने खोला है - यह एक बहुत बुरा है: न केवल यह एक अस्पष्ट मैक्रो का उपयोग करता है, यह भी है 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 का उपयोग करके फ़ंक्शन को परिभाषित करना होगा, जबकि कार्यात्मक संस्करण का उपयोग किसी भी अंतर्निहित के साथ किया जा सकता है समारोह। कई योजना कार्यान्वयन में फ़ंक्शन की धैर्य का निरीक्षण करने के लिए सुविधाएं हैं, और इसका उपयोग करके एक करीबी फ़ंक्शन संस्करण को कार्यान्वित करना संभव है जो मूल कार्य को कॉल करने के बारे में जानता है।

संबंधित मुद्दे