2008-12-15 14 views
15

Tengo el siguiente código de Clojure y no estoy seguro de por qué no está funcionando:"No sabe cómo crear ISEQ de: Símbolo" error en 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))))))) 

(El código es traducida de Paul ANSI Common Lisp libro de Graham)

Cuando corro, me sale el siguiente error:.

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 

¿Qué estoy haciendo mal aquí?

Respuesta

25

El problema es que estoy usando paréntesis ('(' y ')', en lugar de corchetes ('[' y ']'), para la lista de argumentos.

Se debe comenzar a cabo de esta manera:

(defn match [x y &optional binds] 

(he encontrado la respuesta en Programación Clojure por Stuart Halloway.)

+3

Sí. He estado trabajando con Project Euler en Clojure en el último mes más o menos. He resuelto> 60 problemas, pero esto todavía me sucede de forma intermitente (sucedió ayer). Como mensaje de error, es bastante inútil. Este error en particular parece ser uno que solo tienes que aprender a reconocer "quizás deba verificarlo" en lugar de simplemente darte un cabezazo por un tiempo (como lo hice la primera vez que vi esto). – MBCook

14

También, la forma cond no utiliza parens por sus cláusulas :

(cond 
    test1 eval1 
    test2 eval2 
    :else eval3) 
6

La respuesta principal ya estaba dado (argumentos de la función están en [] no() en clojure), pero antes de tratar de meterse con el código de Common Li sp fuentes, recomendaría realmente aprender la sintaxis de Clojure, ya que NO es nada cerca de un puerto CL puro, en absoluto. Simplemente te meterás en problemas para tratarlo como es.

+3

Inútil como respuesta, podría ser un comentario. –

1

Esto parece ser un síntoma de varios errores de sintaxis.

Lo he tenido al accidentalmente escribir un . después de la docstring, es decir "bla bla". en lugar de "bla bla.". Fue bastante difícil de encontrar, porque el número de línea en el mensaje de error era incorrecto.

+0

esta es una buena respuesta, soy novato en Clojure y resultó que tenía un montón de errores de sintaxis, es posible usar 'lein check' para comprobar si hay errores de sintaxis. –

Cuestiones relacionadas