2010-08-31 8 views
9

मैं LISP में एक फ़ंक्शन को परिभाषित करता हूं, और यह सही ढंग से परिभाषित करता है। लेकिन जब भी मैं इसे कॉल करने का प्रयास करता हूं, मुझे एक त्रुटि मिलती है "वेरिएबल फैक्टोरियल अनबाउंड है।"मेरा LISP एक अनबाउंड चर कैसे काम करता है?

मैंने ओएस एक्स और विंडोज 7 दोनों पर लिस्पॉर्क्स और एलेग्रो पर यह कोशिश की है। समारोह है -

(defun factorial (x) 
    (if (= 1 x) 1 
     (* x factorial (- 1 x)))) 

किसी भी मदद की सराहना की जाती है।

+1

आप कोड जहां इसे कहते दिखा सकते हैं: तो अगर हम है कि यह बनाता है बाहर इस तरह के एक चर का उल्लेख करने की कोशिश? – atk

उत्तर

5

ऐसा लगता है कि आप कोष्ठकों का एक सेट छूट रहा है:

(defun factorial (x) 
    (if (= 1 x) 1 
     (* x (factorial (- 1 x))))) 
बिना () आसपास factorial

, लिस्प सोचता है कि आप एक चर एक समारोह के बजाय की चर्चा करते हुए कर रहे हैं।

+0

लगभग-मैं लगभग '(- 1 x)' भी चूक गया। हालांकि मुझे सीएल नहीं पता, इसलिए मैं पूरी तरह से बंद हो सकता था! – Isaac

+3

@ इसाक होड्स: मैंने इसे भी देखा लेकिन मैंने सोचा कि मैं इसे ओपी के लिए एक अभ्यास के रूप में छोड़ दूंगा। :) –

16

अपने कोड की तीसरी पंक्ति में, आप x बार factorial बार 1-x गुणा कर रहे हैं।

नोटिस करने वाली पहली बात factorial एक चर नहीं है: यह एक कार्य है। जैसा कि कॉमन-लिस्प एक लिस्प -2 है, फैक्टोरियल एक चर के रूप में बाध्य नहीं है-यह एक समारोह के रूप में बाध्य है।

आपको factorial फ़ंक्शन को x से कम पर कॉल करने की आवश्यकता है, x एक से कम नहीं।

तो:

(defun factorial (x) 
    (if (= 1 x) 1 
     (* x (factorial (- x 1))))) 

... यह क्या करना चाहिए।

1

@ इसाक होड्स के उत्तर को पूरा करने के लिए, यह आपको दिखाता है कि सीएल में फ़ंक्शन और चर के लिए स्पष्ट रूप से 2 नम्स स्पेस है। यदि आप योजना में थे तो आपको वही त्रुटि नहीं होगी। आप here पढ़ सकते हैं।

+1

यह अभी भी गलत होगा, क्योंकि आपको अभी भी रिकर्सिव कॉल के आसपास कोष्ठक की आवश्यकता है, लेकिन यह एक और दिलचस्प तरीके से गलत होगा। –

+2

हां जिस तरह से मैंने कहा "आपको एक ही त्रुटि नहीं होगी" – mathk

0

आपको उन सभी चर और फ़ंक्शन कॉल को बांधने की आवश्यकता है जिन्हें आप ब्रैकेट के साथ उपयोग करना चाहते हैं जबतक कि आप उन्हें प्रतीक न हों। Ansi Common Lisp

सबसे आम शिकायतों आप लिस्प से सुनेंगे कि एक प्रतीक कोई मूल्य नहीं है या अबाध है में से एक: अनबाउंड त्रुटियों के बारे में, पॉल ग्राहम अपनी पुस्तक में एक अच्छा उदाहरण है। कई विशिष्ट समस्याएं इस तरह से में स्वयं को दिखाती हैं। स्थानीय चर, जैसे चलो और डिफ्यून द्वारा स्थापित, केवल अभिव्यक्ति के शरीर के भीतर वैध हैं जहां वे बनाए गए हैं।

> (progn (let ((x 10)) 
        (format t "Here x = ~A.~%" x)) 
        (format t "But now it's gone...~%") x) 
संबंधित मुद्दे