2011-12-02 18 views
9

में फ़ंक्शन तर्क सूची निर्धारित करना क्या सामान्य फ़िस में फ़ंक्शन ऑब्जेक्ट (या फ़ंक्शन का प्रतीक) दिए गए फ़ंक्शन की तर्क सूची को खोजना संभव है?सामान्य लिस्प

उत्तर

12

यह प्रत्येक सीएल कार्यान्वयन लेकिन स्वांक पैकेज के लिए अलग (स्लाइम प्रदान करता है फ़े Emacs 'minibuffer में arglists दिखा सकते हैं जो) है एक भी समारोह में यह ऊपर लपेटता:

* (defun testfn (arg1 arg2 &key (arg3 :a)) (declare (ignore arg1 arg2 arg3))) 
TESTFN 
* (swank-backend:arglist #'testfn) 
(ARG1 ARG2 &KEY (ARG3 :A)) 

यह भी काम करेंगे तरीकों के लिए:

* (defmethod testmethod ((arg1 t) arg2 &key (arg3 :a)) (declare (ignore arg1 arg2 arg3))) 
STYLE-WARNING: Implicitly creating new generic function TESTMETHOD. 
#<STANDARD-METHOD TESTMETHOD (T T) {1005670231}> 
* (swank-backend:arglist #'testmethod) 
(ARG1 ARG2 &KEY (ARG3 :A)) 

सबसे आसान तरीका है स्वांक पाने के लिए Quicklisp उपयोग करने के लिए है।

+0

एक संगतता परत के रूप में स्वैंक? दिलचस्प – sabof

6

मुझे मानक तरीके से पता नहीं है लेकिन एसबीसीएल में आप sb-introspect:function-lambda-list का उपयोग कर सकते हैं।

(defun test (a &rest rest &key (b 42)) nil) 
(sb-introspect:function-lambda-list #'test) 
=> (A &REST REST &KEY (B 42)) 
5

एएनएसआई कॉमन लिस्प फ़ंक्शन FUNCTION-LAMBDA-EXPRESSION प्रदान करता है, जो कार्यान्वयन का समर्थन करता है और अभिव्यक्ति रिकॉर्ड किया गया है, जो एक लैम्ब्डा अभिव्यक्ति लौटा सकता है। लैम्ब्डा अभिव्यक्ति में, दूसरा आइटम तर्क सूची है - सामान्य रूप से।

अन्यथा एक तर्क सूची वापस करने के लिए एएनएसआई सामान्य लिस्प मानक में परिभाषित नहीं किया गया है और विशिष्ट लिस्प कार्यान्वयन का हिस्सा है। उदाहरण के लिए कुछ 'वितरित' लिस्प एप्लिकेशन में यह जानकारी मौजूद नहीं हो सकती है।

आम तौर पर सबसे आम लिस्प कार्यान्वयन में कुछ आंतरिक पैकेज में एक निर्यात किया गया कार्य ARGLIST होगा।

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