Lisp &引用;Don';I don’我不知道如何从:Symbol“创建ISeq;Clojure中的错误
我有以下Clojure代码,我不知道为什么它不起作用:Lisp &引用;Don';I don’我不知道如何从:Symbol“创建ISeq;Clojure中的错误,lisp,clojure,symbols,Lisp,Clojure,Symbols,我有以下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
(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)))))))
(代码翻译自Paul Graham的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
我做错了什么?问题是我在参数列表中使用了括号(“(”和“)”),而不是方括号(“[”和“]”) 应该是这样开始的:
(defn match [x y &optional binds]
(我在Stuart Halloway编写的Clojure程序中找到了答案。)此外,cond表单的子句不使用paren:
(cond
test1 eval1
test2 eval2
:else eval3)
主要答案已经给出(函数参数在[]中,而不是clojure中的()中),但在尝试处理来自常见Lisp源代码之前,我建议您实际学习clojure的语法,因为它根本不是纯CL端口。如果按原样处理,您只会遇到麻烦。这似乎是各种语法错误的症状
当我不小心在docstring后面写了一个
,即“bla-bla”。
而不是“bla-bla.”
,我就得了这种病。很难找到,因为错误消息中的行号不正确。是的。在上个月左右的时间里,我一直在为Clojure的Euler项目工作。我已经解决了60多个问题,但这种情况仍然时断时续地发生在我身上(就在昨天)。作为一个错误消息,它是毫无帮助的。这个特别的错误似乎是一个你只需要学会识别“也许我需要检查一下”的错误,而不是像我第一次看到这个错误时那样用头撞你一下。答案没有帮助,可能是一条评论。这是一个很好的答案,我是Clojure的新手,结果发现我有很多语法错误,可以使用lein check
检查语法错误。