我在REPL中玩过序列并遇到以下行为,至少对我来说,这是非常不直观的。所以我评估了表达式(cons '("1" "2") "3")
,期望它产生(("1" "2") "3")
,但它产生了(("1" "2") \3)
。
有人可以解释为什么在这种情况下Clojure会自动强制string
到character
吗?我假设这与字符串的内部表示作为字符序列有关。
答案 0 :(得分:4)
cons
的第二个参数是一个序列:
(cons x seq)
返回一个新的seq,其中x是第一个元素,seq是 其余的。
现在你应该知道,如果你不给它一个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")
答案 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根本就没有这种类型的缺点。