有人可以解释"魔法"的行为吗?

xia*_*owl 5 clojure

(conj (drop-last "abcde") (last "abcde"))
Run Code Online (Sandbox Code Playgroud)

回报 (\e \a \b \c \d)

我很困惑.在文档中conj,我注意到了

"添加"可能发生在不同的"地方",具体取决于具体类型.

这是否意味着,LazySeq添加新项目的地方是头?我怎样才能得到(\a \b \c \d \e)结果?

Sco*_*ott 6

''添加'可能发生在不同的"地方",具体取决于 具体类型.

这指的是Clojure的持久集合的行为,它以最有效的方式在性能和底层实现方面加入了添加.

向量总是添加到集合的末尾:

user=> (conj [1 2 3] 4)
[1 2 3 4]
Run Code Online (Sandbox Code Playgroud)

使用Lists,conj将项目放在列表的前面,正如您所注意到的:

user=> (conj '(1 2 3) 4)
(4 1 2 3)
Run Code Online (Sandbox Code Playgroud)

所以,是的,就其具体实现而言,LazySeq被视为List.

我怎样才能得到(\a \b \c \d \e)结果?

有很多方法,但您可以轻松地从LazySeq创建一个向量:

(conj (vec (drop-last "abcde"))
      (last "abcde"))
Run Code Online (Sandbox Code Playgroud)