为什么Clojure用缺点强迫字符串到字符

时间:2015-08-30 14:53:05

标签: clojure sequence cons

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

有人可以解释为什么在这种情况下Clojure会自动强制stringcharacter吗?我假设这与字符串的内部表示作为字符序列有关。

2 个答案:

答案 0 :(得分:4)

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

  

(cons x seq)

     

返回一个新的seq,其中x是第一个元素,seq是     其余的。

现在你应该知道,如果你不给它一个clojure会自动为你创建一个序列。例如,调用seqcons为你做的)会告诉你字符串被转换为字符序列:

(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")

答案 1 :(得分:0)

它不是将字符串强制转换为字符,它是将字符串强制转换为字符序列,因为第二个arg必须是一个集合。

highlightRangeMode: ListView.ApplyRange将一个项目作为其第一个arg,将一个集合作为第二个arg。该集合通过cons函数强制为列表。

seq

如果您想使用user=> (seq "3") (\3) 将列表cons添加到列表("1" "2")之前,那么您可以执行以下操作:

("3")

也许你想要user=> (cons '("1" "2") '("3")) (("1" "2") "3") ,你可以在其他lisps中做的那种非列表缺点,但Clojure根本就没有这种类型的缺点。