2008-12-15 13 views
15
hata

Aşağıdaki Clojure koduna sahip ve bu işe yaramıyor neden emin değilim:"ISEQ dan nasıl oluşturulacağını bilmiyorum: Symbol" 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 Paul'den çevrilmiştir onu çalıştırdığınızda Graham'ın ANSI Common Lisp kitap)

, aşağıdaki hata olsun.

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 

yanlış burada ne yapıyorum?

cevap

25

Sorun, argümanlar listesi için köşeli parantez ('[' ve ']') yerine parantez ('(' ve ')') kullanıyorum.

Böyle dışarı başlamalıdır:

(defn match [x y &optional binds] 

(Stuart Halloway tarafından Programlama Clojure cevabı buldum.)

+3

Yep. Geçen ay Clojure'daki Project Euler ile çalışıyorum. 60 problemi çözdüm, ama bu hala bana açık ve kapalı oluyor (sadece dün oldu). Bir hata mesajı olarak oldukça yararsızdır. Bu özel hata, sadece bir süreliğine kafaya çarpmak yerine (bunu ilk gördüğümde) "belki de bunu kontrol etmem gerekiyor" nu tanımayı öğrenmek zorunda olduğun gibi görünüyor. – MBCook

14

Ayrıca koşul formu onun maddelerine ilişkin parens kullanmaz :

(cond 
    test1 eval1 
    test2 eval2 
    :else eval3) 
6

ana cevap zaten verildi (işlev argümanları [] içindedir değil() Clojure içinde) fakat Ortak Li gelen kodla uğraşmak denemeden önce sp kaynakları, Clojure'ın sözdizimini öğrenmeyi tavsiye ederim, çünkü saf bir CL portuna yakın bir şey DEĞİL. Sadece olduğu gibi davranmakta zorlanacaksın.

+3

Cevap olarak yararsızdır, bir yorum olabilir. –

1

Bu, çeşitli sözdizimi hataları için bir belirti gibi görünüyor.

Yanlışlıkla,yerine . belgelerini yazarken, "bla bla". yerine "bla bla". yazdım. Bulmak zordu çünkü hata mesajındaki satır sayısı yanlıştı.

+0

Bu iyi bir cevap, ben Clojure bir acemi değilim ve sözdizimi hataları kontrol etmek için 'lein check' kullanmak mümkün, bir sürü sözdizimi hataları çıktı ortaya çıktı. –