clojure - 为什么 Clojure 将字符串强制转换为带有 cons 的字符

标签 clojure sequence cons

我在 REPL 中尝试了序列,并遇到了以下行为,至少对我来说,这是非常不直观的。所以我评估了表达式 (cons '("1""2") "3") 期望它产生 (("1""2") "3")但它却产生了 (("1""2")\3)

有人可以解释一下为什么 Clojure 在这种情况下会自动将 string 强制转换为 character 吗?我认为这与字符串作为字符序列的内部表示有关。

最佳答案

cons 的第二个参数是一个序列:

(cons x seq)

Returns a new seq where x is the first element and seq is the rest.

现在你应该知道,如果你不给它一个序列,Clojure 会自动为你创建一个序列。例如,调用 seq (cons 为您做的事情)将显示字符串已转换为字符序列:

(seq "32")
=> (\3 \2)

这是由 clojure 的 runtime in RT.java 完成的:

else if(coll instanceof CharSequence)
    return StringSeq.create((CharSequence) coll);

相反,如果您希望将角色视为单个项目,那么您可以将其包装起来:

(cons '("1" "2") '("3"))
=> (("1" "2") "3")

关于clojure - 为什么 Clojure 将字符串强制转换为带有 cons 的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32297823/

相关文章:

clojure - 惯用的 clojure 有条件地调用函数

c - 查找一个数组是否是另一个数组的子序列

python - 如何创建一个独特的对象?

function - 运行特定的 Clojure 命名空间函数?

functional-programming - 是否有用于函数式编程的软件工程方法论?

java - 故意限制或继承 Clojure 符号名称?

r - 在 R 中创建一系列间隔

sql - 如何检查序列是否大于某个数字,以及是否在Postgres中进行更改

scheme - 诸如 (set! c (cons 3 c)) 之类的表达式是将项目添加到列表的方式吗?