2008-12-15 8 views
15
में त्रुटि

मैं निम्नलिखित Clojure कोड है और मुझे यकीन है कि क्यों यह काम नहीं कर रहा नहीं कर रहा हूँ:"से ISeq बनाने के लिए कैसे पता नहीं है: प्रतीक" Clojure

(defn match (x y &optional binds) 
    (cond 
    ((eql x y) (values binds t)) 
    ((assoc x binds) (match (binding x binds) y binds)) 
    ((assoc y binds) (match x (binding y binds) binds)) 
    ((var? x) (values (cons (cons x y) binds) t)) 
    ((var? y) (values (cons (cons y x) binds) t)) 
    (t 
    (when (and (consp x) (consp y)) 
     (multiple-value-bind (b2 yes) 
          (match (car x) (car y) binds) 
     (and yes (match (cdr x) (cdr y) b2))))))) 

(कोड पॉल से अनुवाद किया है ग्राहम एएनएसआई कॉमन लिस्प पुस्तक)

जब मैंने इसे चलाने के लिए, मैं निम्नलिखित त्रुटि हो:।

java.lang.IllegalArgumentException: Don't know how to create ISeq from: Symbol 
clojure.lang.Compiler$CompilerException: NO_SOURCE_FILE:2: java.lang.RuntimeException: java.lang.IllegalArgumentException: Don't know how to create ISeq from: Symbol 
     at clojure.lang.Compiler.analyze(Compiler.java:3713) 
     at clojure.lang.Compiler.analyzeSeq(Compiler.java:3848) 
     at clojure.lang.Compiler.analyze(Compiler.java:3698) 
     at clojure.lang.Compiler.access$200(Compiler.java:37) 
     at clojure.lang.Compiler$DefExpr$Parser.parse(Compiler.java:343) 
     at clojure.lang.Compiler.analyzeSeq(Compiler.java:3858) 
     at clojure.lang.Compiler.analyze(Compiler.java:3698) 
     at clojure.lang.Compiler.analyzeSeq(Compiler.java:3848) 
     at clojure.lang.Compiler.analyze(Compiler.java:3698) 
     at clojure.lang.Compiler.analyze(Compiler.java:3671) 
     at clojure.lang.Compiler.eval(Compiler.java:3895) 
     at clojure.lang.Repl.main(Repl.java:75) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
     at java.lang.reflect.Method.invoke(Unknown Source) 
     at jline.ConsoleRunner.main(ConsoleRunner.java:69) 
Caused by: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.IllegalArgumentException: Don't know how to create ISeq from: Symbol 
     at clojure.lang.LazyCons.rest(LazyCons.java:64) 
     at clojure.lang.ASeq.count(ASeq.java:85) 
     at clojure.lang.RT.count(RT.java:486) 
     at clojure.lang.Cons.count(Cons.java:41) 
     at clojure.lang.Compiler.analyze(Compiler.java:3695) 
     ... 16 more 
Caused by: java.lang.RuntimeException: java.lang.IllegalArgumentException: Don't know how to create ISeq from: Symbol 
     at clojure.lang.LazyCons.first(LazyCons.java:44) 
     at clojure.lang.LazyCons.rest(LazyCons.java:59) 
     ... 20 more 
Caused by: java.lang.IllegalArgumentException: Don't know how to create ISeq from: Symbol 
     at clojure.lang.RT.seqFrom(RT.java:465) 
     at clojure.lang.RT.seq(RT.java:448) 
     at clojure.seq__28.invoke(boot.clj:92) 
     at clojure.every_QMARK___596.invoke(boot.clj:1180) 
     at clojure.fn__1147$psig__1149.invoke(boot.clj:2155) 
     at clojure.map__602$fn__605.invoke(boot.clj:1214) 
     at clojure.lang.LazyCons.first(LazyCons.java:40) 
     ... 21 more 

क्या मैं गलत यहाँ कर रहा हूँ?

उत्तर

25

समस्या यह है कि मैं तर्क सूची के लिए वर्ग ब्रैकेट ('[' और ']') के बजाय ब्रांड्स ('(' और ')') का उपयोग कर रहा हूं।

यह इस तरह बाहर शुरू कर देना चाहिए:

(defn match [x y &optional binds] 

(मैं स्टुअर्ट Halloway द्वारा प्रोग्रामिंग Clojure में जवाब मिल गया।)

+3

हाँ। मैं पिछले महीने या तो क्लोजर पर प्रोजेक्ट यूलर के माध्यम से काम कर रहा हूं। मैंने हल किया है> 60 समस्याएं, लेकिन यह अभी भी मेरे साथ और बंद होता है (कल बस हुआ)। एक त्रुटि संदेश के रूप में, यह काफी अनुपयोगी है। यह विशेष त्रुटि एक ऐसा प्रतीत होता है जिसे आपको बस थोड़ी देर के लिए सिर पर टक्कर मारने के बजाय "शायद मुझे इसकी जांच करने की ज़रूरत है" को पहचानना सीखना है (जैसा कि मैंने पहली बार देखा था)। – MBCook

14

इसके अलावा, cond प्रपत्र अपने खंड के लिए कोष्ठक का उपयोग नहीं करता :

(cond 
    test1 eval1 
    test2 eval2 
    :else eval3) 
6

मुख्य जवाब पहले से ही दिया गया था (समारोह तर्क [] में हैं नहीं() clojure में), लेकिन आम ली से कोड के साथ गड़बड़ करने के लिए प्रयास करने से पहले एसपी स्रोत, मैं वास्तव में क्लोजर के वाक्यविन्यास सीखने की सिफारिश करता हूं, क्योंकि यह शुद्ध सीएल बंदरगाह के करीब कुछ भी नहीं है। आप इसे इस तरह के इलाज में परेशानी में जा रहे हैं।

+3

उत्तर के रूप में अनुपयोगी, यह एक टिप्पणी हो सकती है। –

1

यह विभिन्न वाक्यविन्यास त्रुटियों के लिए एक लक्षण प्रतीत होता है।

डॉकस्ट्रिंग के बाद गलती से . लिखते समय, "bla bla." के बजाय "bla bla". लिखने पर मुझे यह मिला है। यह खोजना मुश्किल था, क्योंकि त्रुटि संदेश में पंक्ति संख्या गलत थी।

+0

यह एक अच्छा जवाब है, मैं क्लोजर में नौसिखिया हूं और यह पता चला कि मेरे पास सिंटैक्स त्रुटियों का एक गुच्छा था, सिंटैक्स त्रुटियों की जांच के लिए 'लीन चेक' का उपयोग करना संभव है। –

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