2009-09-06 19 views
7

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

मैंने Lisp: CHAR is neither declared nor bound पर एक समान त्रुटि देखी लेकिन ओपी के अलावा एक समाधान वास्तव में नहीं पहुंचा था, उसने महसूस किया कि उसने "टाइपिंग गलती" की है। आरईपीएल में मैं setf फ़ंक्शन का उपयोग कर सकता हूं और यह ठीक काम करता है। मैं Emacs के साथ LispBox का भी उपयोग कर रहा हूँ। हम किसी भी सुझाव की सराहना करेंगे! आईटी तथ्य में

(defun it-fact(num) 
    (setf result 1) 
    (dotimes (i num) 
    (setf result (* result (+ i 1))) 
) 
) 

चेतावनी: परिणाम न घोषित है और न ही बाध्य है, यह है कि यह विशेष घोषित किया गया माना जाएगा।

+1

देखें http://www.cs.cmu.edu/Groups/AI /html/faqs/lang/lisp/part1/faq-doc-4.html, विशेष रूप से "अच्छा:" उदाहरण। यहां लोग किसी भी तरह से अनुकूल हैं, लेकिन यदि कोड सामान्य लिस्प कोड की तरह इंडेंट किया गया है तो कोड पढ़ने में आसान है। चीयर्स! – Alec

उत्तर

5

आप चर 'परिणाम' बाध्य करने के लिए की जरूरत है - का उपयोग करते हुए 'चलो', उदाहरण के लिए - यह उपयोग करने के लिए शुरू करने से पहले:

(defun it-fact(num) 
    (let ((result 1)) 
    (dotimes (i num) 
     (setf result (* result (+ i 1)))))) 

आगे विवरण आप this को पढ़ने के लिए चाहते हो सकता है के लिए ...

+0

ओह मैं देखता हूं। मैंने पहले भी 'चलो' की कोशिश की थी, लेकिन मैं इसका इस्तेमाल कर रहा था जैसे कि यह सेटफ था, और मैंने लेट के कंस्ट्रैसिस के अंदर डॉटिम्स लूप शामिल नहीं किया था। मुझे लगता है कि गुंजाइश या कुछ के साथ करना है। सहायता के लिए हर किसी को धन्यवाद! – Aaron

+0

गंभीरता से, अपना कोड ठीक से इंडेंट करें। –

+0

चूंकि मैं मुख्य रूप से एक जावा प्रोग्रामर हूं, इसलिए आप आसानी से देख सकते हैं कि मैंने ब्रांड्स को क्यों लाया (उन्हें ब्रैकेट से ज्यादा कुछ नहीं देखा)। मैंने बाद में प्रस्तुत किए गए उदाहरणों के लिए एक पंक्ति पर समापन अभिभावकों को रखने के लिए उपयोग किया है, इसलिए यह "गंभीरता से" एक सौदा का बड़ा नहीं है। धन्यवाद वैसे :) – Aaron

5

लिस्प में, स्थानीय चर को स्पष्ट रूप से एलईटी या अन्य रूपों के साथ घोषित किया जाना चाहिए जो स्थानीय चर बनाते हैं। जो कि से अलग है पायथन या जावास्क्रिप्ट जहां चर के लिए असाइनमेंट वर्तमान लेक्सिकल स्कोप में चर बनाता है।

आपका उदाहरण इस तरह फिर से लिखा जा सकता है:

(defun it-fact(num) 
    (let ((result 1)) 
    (dotimes (i num) 
     (setf result (* result (+ i 1)))))) 

एक विषय से हटकर टिप्पणी: वहाँ अलग पंक्ति में बंद करने कोष्ठक डालने का कोई मतलब नहीं है।

6

कुछ चीजें गलत या इतना अच्छा नहीं लिस्प शैली हैं:

(defun it-fact(num)      ; style: use a space before (
    (setf result 1)      ; bad: variable result is not introduced 
    (dotimes (i num) 
    (setf result (* result (+ i 1)))  ; bad: extra addition in each iteration 
)          ; style: parentheses on a single line 
)          ; bad: no useful return value 

एक संभावित संस्करण:

(defun it-fact (num) 
    (let ((result 1))      ; local variable introduced with LET 
    (loop for i from 1 upto num   ; i starts with 1, no extra addition 
     do (setf result (* result i))) 
    result))        ; result gets returned from the LET 
+2

सुझावों के लिए धन्यवाद! हाँ, मुझे एहसास हुआ कि डॉटिम्स 0 से शुरू हुआ है और यदि मैंने इसे गुणा में नहीं बढ़ाया है तो यह हमेशा 0 लौटाएगा ... आपका लूप पढ़ने में आसान लग रहा है। मुझे लगता है कि मैंने इस तरह की प्रत्येक पंक्ति पर ब्रांडेसिस डाला है क्योंकि मैं अभी भी सी ++/जावा से ब्रेसिज़ करने के लिए उपयोग किया जाता हूं, लेकिन मैं आपके अभ्यास को लिस्प के लिए अपनाने की कोशिश करूंगा। ओह, हाँ, मैंने वापसी की अनदेखी की, इन चीजों को इंगित करने के लिए धन्यवाद! – Aaron

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