2008-12-15 5 views
15

J'ai le code suivant Clojure et je ne sais pas pourquoi cela ne fonctionne pas:« Je ne sais pas comment créer isEq de: Symbole » erreur dans 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))))))) 

(Le code est traduit de Paul Graham ANSI Common Lisp livre)

Quand je lance, je reçois l'erreur suivante:.

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'est-ce que je fais mal ici?

Répondre

25

Le problème est que j'utilise des parenthèses ('(' et ')'), plutôt que des crochets ('[' et ']'), pour la liste des arguments.

Il devrait commencer comme ceci:

(defn match [x y &optional binds] 

(j'ai trouvé la réponse dans Programmation Clojure par Stuart Halloway.)

+3

Oui. J'ai travaillé sur Project Euler sur Clojure au cours du dernier mois. J'ai résolu plus de 60 problèmes, mais cela m'arrive encore et encore (c'est arrivé hier). Comme un message d'erreur, c'est très inutile. Cette erreur particulière semble être celle que vous avez juste à apprendre à reconnaître "peut-être que j'ai besoin de vérifier cela" au lieu de vous taper la tête pendant un moment (comme je l'ai fait la première fois que j'ai vu ça). – MBCook

14

En outre, le formulaire de cond n'utilise pas parens pour ses clauses :

(cond 
    test1 eval1 
    test2 eval2 
    :else eval3) 
6

La principale réponse a déjà été donnée (arguments de la fonction sont [] non() dans clojure) mais avant d'essayer de salir avec le code de Common Li En ce qui concerne les sources sp, je vous recommande d'apprendre la syntaxe de Clojure, car elle n'est PAS du tout un port CL pur. Vous allez juste avoir des ennuis à le traiter comme ça.

+3

Inutile comme réponse, ce pourrait être un commentaire. –

1

Cela semble être un symptôme pour diverses erreurs de syntaxe.

Je l'ai eu lors de l'écriture accidentelle d'un . après la docstring, c'est-à-dire "bla bla". au lieu de "bla bla.". C'était plutôt difficile à trouver, parce que le numéro de ligne dans le message d'erreur était incorrect.

+0

c'est une bonne réponse, je suis un débutant chez Clojure et il s'est avéré que j'avais un tas d'erreurs de syntaxe, il est possible d'utiliser 'lein check' pour vérifier les erreurs de syntaxe. –

Questions connexes