【问题标题】:Why are apostrophes needed for a list with conj in Clojure?为什么 Clojure 中带有 conj 的列表需要撇号?
【发布时间】:2015-11-27 01:44:03
【问题描述】:

最后,如果你运行以下代码:

(conj (1 2 3) 4)

它会出错并说:

ClassCastException java.lang.Long cannot be cast to clojure.lang.IFn

但是,如果你在列表前加一个撇号,它会正常运行

(conj '(1 2 3) 4)

我的问题是,这个撇号到底有什么作用,为什么这个列表实际上需要它?

我注意到当您使用矢量时不会发生这种情况

(conj [1 2 3] 4)

事实上,即使您使用撇号 (conj '[1 2 3] ),它仍然可以正常工作并返回相同的结果。

撇号到底有什么作用,为什么列表需要它,而向量不需要? (抱歉,如果这是一个初学者/愚蠢的问题,我仍在学习。非常感谢您提供详尽的答案)

【问题讨论】:

标签: clojure


【解决方案1】:

list(括号)和vector(括号)之间存在根本区别,列表用于函数调用,而向量只是向量文字。

撇号是quote 的读取器宏,它禁止评估。例如,(+ 1 2) 在从源文件读入时被评估为 3,但'(+ 1 2) 被读入为listclojure.lang.PersistentList,符合代码就是数据的思想在口齿不清。另一方面,引用向量只是 vector 本身。

所以在你的情况下,(conj (1 2 3) 4) 在读入时,它会尝试使用参数23 调用名为1 的函数,难怪它会失败。但是一个带引号的列表,或者一个向量可以附加一个额外的元素。

【讨论】:

    猜你喜欢
    • 2015-10-25
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 2011-03-01
    • 1970-01-01
    • 2018-06-21
    相关资源
    最近更新 更多