【问题标题】:clojure throws error by macro list result evaluationclojure 通过宏列表结果评估引发错误
【发布时间】:2014-11-07 15:10:43
【问题描述】:

我写过这么简单的clojure程序:

(defmacro lister[n]
  (let
    [x (range n)]
    `(max ~@(x))
  )
)

; (macroexpand (lister 5))
(lister 5)

当我尝试评估(lister 5)时,clojure 退出并出现错误:

CompilerException java.lang.ClassCastException: clojure.lang.LazySeq 无法转换为 clojure.lang.IFn,编译:(:30:3)

我做错了什么?当我用它的值替换 x 时 - (范围 10) 宏运行良好。

【问题讨论】:

    标签: macros clojure


    【解决方案1】:

    你不需要 x 周围的括号。

    (defmacro lister[n]
      (let [x (range n)]
        `(max ~@x)))
    

    你实际上也可以用这个更简单地写这个:

    (defmacro lister[n]
      `(max ~@(range n)))
    

    【讨论】:

    • 扩展您的答案,(x) 意味着 x 将被评估为一个函数,因此错误 clojure.lang.LazySeq cannot be cast to clojure.lang.IFnp。请记住,列表的第一个元素始终作为函数进行评估;)
    猜你喜欢
    • 2012-11-19
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    相关资源
    最近更新 更多