2013-03-17 11 views
7

में फ़ंक्शन की एरीटी पाएं मैं कुछ आनुवांशिक प्रोग्रामिंग कर रहा हूं और मैं अपने धर्मार्थ के आधार पर कार्यों को अलग-अलग फ़ंक्शन सेट में अलग कर रहा हूं; यह सब जटिल है।सामान्य लिस्प

मैं जानना चाहता हूं कि ऐसा करने का एक आसान तरीका है या नहीं। उदाहरण के लिए, यदि कोई ऐसा फ़ंक्शन है जो किसी दिए गए फ़ंक्शन की धर्मार्थता देता है।

अग्रिम में चीयर्स।

+2

कुछ का उपयोग करने की आवश्यकता होगी कार्यान्वयन पर निर्भर होने के लिए लगता है। Https://groups.google.com/forum/#!msg/comp.lang.lisp/0WoivuykcKM/0SnbqcFyNogJ –

उत्तर

8

व्याख्या किए गए कार्यों के लिए आपको function-lambda-expression का उपयोग करने में सक्षम होना चाहिए।

संकलित कार्यों के लिए, अफसोस, इस समारोह अक्सर nil देता है, तो आप एक कार्यान्वयन पर निर्भर समारोह (clocc/port/sys.lisp) का उपयोग करना होगा:

(defun arglist (fn) 
    "Return the signature of the function." 
    #+allegro (excl:arglist fn) 
    #+clisp (sys::arglist fn) 
    #+(or cmu scl) 
    (let ((f (coerce fn 'function))) 
    (typecase f 
     (STANDARD-GENERIC-FUNCTION (pcl:generic-function-lambda-list f)) 
     (EVAL:INTERPRETED-FUNCTION (eval:interpreted-function-arglist f)) 
     (FUNCTION (values (read-from-string (kernel:%function-arglist f)))))) 
    #+cormanlisp (ccl:function-lambda-list 
       (typecase fn (symbol (fdefinition fn)) (t fn))) 
    #+gcl (let ((fn (etypecase fn 
        (symbol fn) 
        (function (si:compiled-function-name fn))))) 
      (get fn 'si:debug)) 
    #+lispworks (lw:function-lambda-list fn) 
    #+lucid (lcl:arglist fn) 
    #+sbcl (sb-introspect:function-lambda-list fn) 
    #-(or allegro clisp cmu cormanlisp gcl lispworks lucid sbcl scl) 
    (error 'not-implemented :proc (list 'arglist fn))) 

संपादित करें: ध्यान दें कि arity में सीएल वास्तव में एक संख्या नहीं है, क्योंकि लिस्प फ़ंक्शन optional, rest और keyword तर्क required के अलावा तर्क स्वीकार कर सकते हैं; यही कारण है कि उपर्युक्त arglist फ़ंक्शन तर्क संख्या के lambda list देता है, संख्या नहीं।

आप केवल कार्य करता है जो केवल आवश्यक पैरामीटर स्वीकार करने में रुचि रखते हैं, तो आप की तरह

(defun arity (fn) 
    (let ((arglist (arglist fn))) 
    (if (intersect arglist lambda-list-keywords) 
     (error "~S lambda list ~S contains keywords" fn arglist) 
     (length arglist)))) 
+0

धन्यवाद, मैंने अभी पाया है कि मैं क्लिसप के अपने # 'arglist को कॉल कर सकता हूं, फिर सूची में सदस्य खोज कर सकता हूं यह वापस आता है। –