"Weiß nicht, wie zu erstellen ISeq aus: Symbol" Fehler in Clojure
Habe ich Folgendes Clojure-code und ich bin mir nicht sicher, warum es nicht funktioniert:
(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)))))))
(Der code wird übersetzt von Paul Graham ANSI Common Lisp Buch.)
Wenn ich es laufen lasse, bekomme ich die folgende Fehlermeldung:
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
Was mache ich hier falsch?
InformationsquelleAutor der Frage Paul Reiners | 2008-12-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass ich mich mit Klammern ('(' und ')'), anstatt den eckigen Klammern ('[' und ']'), für die Argumente-Liste.
Sollten Sie beginnen aus wie diese:
(Ich fand die Antwort in Programmierung Clojure von Stuart Halloway.)
InformationsquelleAutor der Antwort Paul Reiners
Auch die cond-form nicht verwenden, parens für seine Klauseln:
InformationsquelleAutor der Antwort drewr
Die wichtigste Antwort wurde bereits gegeben (Funktions-Argumente werden in [] not () in clojure) aber, bevor Sie versuchen, um Durcheinander mit dem code aus Common Lisp-Quellen, würde ich empfehlen, tatsächlich lernen die syntax von Clojure, wie es ist, NICHT alles in der Nähe zu einem reinen CL-port, an alle. Sie sind nur zu in Schwierigkeiten geraten, behandeln Sie es wie es ist.
InformationsquelleAutor der Antwort Runevault
Scheint dies ein symptom für verschiedene syntax-Fehler.
Ich habe es beim schreiben versehentlich ein
.
nach der docstring, d.h."bla bla".
statt"bla bla."
. Es war ziemlich schwer zu finden, weil die Zeilennummer in der Fehlermeldung falsch war.InformationsquelleAutor der Antwort starblue