2008-12-15 18 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))))))) 

(代碼是從保羅翻譯格雷厄姆的ANSI Common Lisp的書)

當我運行它,我得到以下錯誤:

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] 

(我發現由Stuart哈洛韋在編程Clojure的答案。)

+3

是的。上個月我一直在Clojure上完成Project Euler。我已經解決了> 60個問題,但這仍然發生在我上下(昨天發生)。作爲錯誤消息,這是非常無益的。這個特殊的錯誤似乎是你必須學會​​認識到「也許我需要檢查一下」,而不是僅僅撞你一會兒(正如我第一次看到這個)。 – MBCook 2009-07-11 01:57:24

14

此外,COND形式不使用括號其條款:

(cond 
    test1 eval1 
    test2 eval2 
    :else eval3) 
6

主要答案已經給出(函數的參數是[]否()Clojure中),但試圖亂用常用從李代碼之前sp來源,我建議實際學習Clojure的語法,因爲它根本不是接近純粹的CL端口。你只是會遇到麻煩就好了。

+3

沒有幫助的答案,它可能是一個評論。 – 2014-12-22 04:52:54

1

這似乎是各種語法錯誤的症狀。

我已經在文檔字符串後面寫了.,即"bla bla".而不是"bla bla."。這很難找到,因爲錯誤消息中的行號不正確。

+0

這是一個很好的答案,我是Clojure的新手,事實證明我有一堆語法錯誤,可以使用`lein check`來檢查語法錯誤。 – 2016-03-14 17:46:47

相關問題