2010-09-22 13 views
5

उदाहरण के लिए, मैं एक समारोहएक defun के भीतर एक समारोह को कैसे परिभाषित करें?

(personal-function 'func-name '(attr1 attr2 ...)) 

और मुझे क्या करना चाहते हैं समारोह नाम पारित

(defun personal-function (func-name) 
    (defun func-name '(attr1 attr2 ...) (dosomething))) 

है हालांकि, यह कहा कि मैं defun एक प्रतीक के साथ नहीं कर सकते हैं ... क्या क्या मुझे करना चाहिए?

+0

डिफ्यून नाम, arglist या शरीर का मूल्यांकन नहीं करता है। सभी को शाब्दिक मूल्य होना चाहिए। तो आपके कोड में दो समस्याएं हैं।1) यह एक समारोह func-name परिभाषित करेगा। 2) एक उद्धृत आर्किगिस्ट जो भी आप उम्मीद करते हैं वह भी नहीं करेगा। –

उत्तर

3

उपयोग

(setf (symbol-function my-symbol) some-function) 

(compile nil (list 'lambda args body)) 

जहां आर्ग और शरीर सार्थक मान के साथ एक नया समारोह पैदा करते हैं।

+0

समझ में नहीं आ रहा है: क्या उपयोग करना, setf या संकलित करना, या दोनों का कुछ संयोजन (ऐसा कैसा दिखता है?)। आपने वास्तव में मूल पोस्ट से उदाहरण की भावना में अन्य फ़ंक्शन परिभाषा के अंदर फ़ंक्शन परिभाषा का उदाहरण प्रदान नहीं किया था। –

+0

@Artem Pelenitsyn: मैं पहले फ़ंक्शन ऑब्जेक्ट बनाउंगा और उसके बाद प्रतीक फ़ंक्शन सेट करूँगा। –

1

आप एक समारोह के भीतर एक नया विश्व स्तर पर सुलभ समारोह बनाने की कोशिश कर रहे हैं, जो लैम्ब्डा

http://www.n-a-n-o.com/lisp/cmucl-tutorials/LISP-tutorial-21.html

इस्तेमाल कर सकते हैं, मुझे नहीं लगता कि भाषा के व्याकरण कि के लिए अनुमति देता है। यदि आप लैम्ब्डा बनाते हैं, तो आप एक वैरिएबल को इस लैम्ब्डा मान में प्रारंभ कर सकते हैं और चर को अपने कार्यों में पास कर सकते हैं। सामान्य LISP में, आप यह निर्धारित करने के लिए कॉल (functionp x) को कॉल कर सकते हैं कि आप इसे कॉल करने का प्रयास करने से पहले एक चर है।

+0

बहुत बहुत धन्यवाद। हालांकि, मेरे दुभाषिया मुझे बताता है कि परिभाषित एक समारोह नहीं है ...? "त्रुटि: 'डेफिन' को कॉल करने का प्रयास करें जो एक अनिर्धारित कार्य है।" – Frost

+0

क्या आप सामान्य LISP का उपयोग कर रहे हैं? योजना? –

+0

मैं सामान्य LISP ~ – Frost

2

इस प्रकार यह समाधान:

e.g1

(defun create-function(a1) 
    (defun plus-function(x) (+ x a1))) 

(create-function 2) -> PLUS-FUNCTION 
(plus-function 3) ->5 

e.g2

(setf (symbol-function 'printx) #'(lambda (x) (print x))) 

(printx '(1 2 3)) -> (1 2 3) 

पहले मैं भी एक ही समस्या है जब मैं समारोह में परिभाषित किया गया था।

उदाहरण:

(defun test-function(fn) 
      (defun fn ((lambda() (print "aaa"))))) 

मैं चलाने के बाद

(test-function 'aaafunction) 

मूल्यांकन परिणाम

FN 

यह "aaafunction" नामक एक समारोह वापस नहीं करता है ...

है

फारो के लिए n जो मेरे उत्तर को कम करता है: हम लिस्प के नए हैं, लेकिन हम ज्ञान सीखने के लिए कड़ी मेहनत कर रहे हैं, और आप बहुत सम्मानित नहीं हैं।

+0

'defun' फ़ंक्शन नाम देता है, फ़ंक्शन नहीं: http://www.cs.cmu.edu/Groups/AI/html/hyperspec/HyperSpec/Body/mac_defun.html – Ken

+0

डिफ्यून –

+0

नाम का मूल्यांकन नहीं करता है तो कैसे क्या मैं इसे "एफएन" का मूल्यांकन करने के लिए मजबूर करता हूं? –

0

मैं मेटाप्रोग्रामिंग के लिए defmacros का उपयोग करता हूं, उदाहरण के लिए, this emacs lisp उदाहरण।

0

मैक्रो का उपयोग करना एक अच्छा विकल्प होगा। जैसे (डीफमैक्रो व्यक्तिगत-फ़ंक्शन (func-name) `(defun, func-name '(attr1 attr2 ...) (dosomething)) कृपया कोशिश करें, उम्मीद है कि आपकी मदद करता है।

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