【问题标题】:"Don't know how to create ISeq from: Symbol" error in ClojureClojure 中的“不知道如何从:符号创建 ISeq”错误
【发布时间】:2010-09-27 00:22:10
【问题描述】:

我有以下 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)))))))

(代码翻译自 Paul Graham 的 ANSI Common Lisp 书。)

当我运行它时,我收到以下错误:

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

我在这里做错了什么?

【问题讨论】:

    标签: lisp clojure symbols


    【解决方案1】:

    这似乎是各种语法错误的症状。

    我在文档字符串后不小心写了. 时遇到过这种情况,即"bla bla". 而不是"bla bla."。比较难找,因为错误信息中的行号不正确。

    【讨论】:

    • 这是一个很好的答案,我是 Clojure 的新手,结果发现我有一堆语法错误,可以使用 lein check 来检查语法错误。
    【解决方案2】:

    主要答案已经给出(函数参数在 [] 而不是 () 在 clojure 中)但是在尝试弄乱 Common Lisp 源代码之前,我建议实际学习 Clojure 的语法,因为它不是任何接近的东西一个纯粹的 CL 端口。照原样对待它只会遇到麻烦。

    【讨论】:

    • 回答无用,可能是评论。
    【解决方案3】:

    另外,cond 形式的子句不使用括号:

    (cond
      test1 eval1
      test2 eval2
      :else eval3)
    

    【讨论】:

      【解决方案4】:

      问题是我在参数列表中使用了括号('(' 和 ')'),而不是方括号('[' 和 ']')。

      它应该像这样开始:

      (defn match [x y &optional binds]
      

      (我在 Stuart Halloway 的 Programming Clojure 中找到了答案。)

      【讨论】:

      • 是的。上个月左右,我一直在 Clojure 上通过 Project Euler 工作。我已经解决了超过 60 个问题,但这仍然会时断时续地发生在我身上(就在昨天发生)。作为错误消息,它非常无用。这个特殊的错误似乎是你只需要学会识别“也许我需要检查一下”而不是仅仅用头撞你一会儿(就像我第一次看到这个时所做的那样)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多