2008-12-15 11 views
15

Mam następujący kod Clojure i nie jestem pewien, dlaczego to nie działa:„Nie wiem, jak tworzyć ISeq od: symbol” błąd w 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))))))) 

(Kod jest tłumaczone z Pawłem ANSI Common Lisp książka Grahama)

Kiedy go uruchomić, pojawia się następujący błąd:.

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 

Co robię źle tutaj?

Odpowiedz

25

Problem polega na tym, że używam nawiasów ("(" i ")") zamiast nawiasów kwadratowych ("[" i "]") dla listy argumentów.

To powinno rozpocząć się tak:

(defn match [x y &optional binds] 

(znalazłem odpowiedź w Programming Clojure Stuart Halloway.)

+3

Tak. Pracowałem w Projekcie Euler na Clojure w ciągu ostatniego miesiąca. Rozwiązałem> 60 problemów, ale wciąż mi się to zdarza i wyłączam (zdarzyło się to tylko wczoraj). Jako komunikat o błędzie jest to nieprzydatne. Ten szczególny błąd wydaje się być tym, któremu musisz po prostu nauczyć się rozpoznawać "może muszę to sprawdzić" zamiast po prostu uderzać głową przez chwilę (tak jak to zrobiłem pierwszy raz, kiedy to zobaczyłem). – MBCook

14

Również forma dyr nie korzysta ze swoich parens klauzul :

(cond 
    test1 eval1 
    test2 eval2 
    :else eval3) 
6

Główna odpowiedź została już podana (argumenty funkcji są w [] nie() w clojure), ale przed próbą bałagan z kodem z Common Li sp źródła, poleciłbym w rzeczywistości poznanie składni Clojure'a, ponieważ wcale NIE jest to coś zbliżonego do czystego portu CL. Po prostu wpadniesz w kłopoty, traktując to tak, jak jest.

+3

Niepomocne jako odpowiedź, może to być komentarz. –

1

To wydaje się być objawem różnych błędów składniowych.

Miałem go po przypadkowym napisaniu . po docstruowaniu, tj. "bla bla". zamiast "bla bla.". Trudno było go znaleźć, ponieważ numer linii w komunikacie o błędzie był nieprawidłowy.

+0

to jest dobra odpowiedź, jestem nowicjuszem w Clojure i okazało się, że mam masę błędów składniowych, możliwe jest użycie 'lein check' do sprawdzenia błędów składniowych. –