2008-12-15 19 views
15

Tôi có mã Clojure sau và tôi không chắc chắn lý do tại sao nó không làm việc:"Không biết làm thế nào để tạo ISeq từ: Symbol" lỗi trong 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))))))) 

(Mã này được dịch từ Paul ANSI Common Lisp cuốn sách Graham)

Khi tôi chạy nó, tôi nhận được lỗi sau:.

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 

tôi đang làm gì sai ở đây?

Trả lời

25

Vấn đề là tôi đang sử dụng dấu ngoặc đơn ('(' và ')'), thay vì dấu ngoặc vuông ('[' và ']'), cho danh sách đối số.

Nên bắt đầu như thế này:

(defn match [x y &optional binds] 

(Tôi tìm thấy câu trả lời trong Lập trình Clojure bởi Stuart Halloway.)

+3

Đúng. Tôi đã làm việc thông qua Project Euler trên Clojure trong tháng vừa rồi. Tôi đã giải quyết được> 60 vấn đề, nhưng điều này vẫn xảy ra với tôi và tắt (xảy ra chỉ ngày hôm qua). Như một thông báo lỗi, nó khá vô ích. Lỗi cụ thể này có vẻ là một trong những bạn chỉ cần học cách nhận ra "có lẽ tôi cần kiểm tra" thay vì chỉ đập đầu bạn một lúc (như tôi đã làm lần đầu tiên tôi thấy điều này). – MBCook

14

Ngoài ra, hình thức cond không sử dụng dấu ngoặc cho khoản của mình :

(cond 
    test1 eval1 
    test2 eval2 
    :else eval3) 
6

Câu trả lời chính đã được đưa ra (các đối số hàm trong [] không() trong clojure) nhưng trước khi cố gắng làm rối loạn mã từ Common Li nguồn sp, tôi khuyên bạn nên thực sự học cú pháp của Clojure, vì nó không phải là bất cứ điều gì gần với một cổng CL tinh khiết, ở tất cả. Bạn sẽ chỉ gặp rắc rối khi xử lý nó như vậy.

+3

Không hữu ích như câu trả lời, nó có thể là một bình luận. –

1

Điều này có vẻ là một triệu chứng cho các lỗi cú pháp khác nhau.

Tôi đã có nó khi vô tình viết . sau chuỗi tài liệu, tức là "bla bla". thay vì "bla bla.". Nó khá khó tìm, bởi vì số dòng trong thông báo lỗi không chính xác.

+0

đây là một câu trả lời hay, tôi là một người mới ở Clojure và hóa ra tôi có một loạt lỗi cú pháp, có thể sử dụng 'lein check' để kiểm tra lỗi cú pháp. –

Các vấn đề liên quan