Clojure 克罗朱尔。向量和列表。偷看

Clojure 克罗朱尔。向量和列表。偷看,clojure,Clojure,我是克洛朱尔·努布。玩列表和向量 > (peek [1 2 3 4]) 4 > (peek '(1 2 3 4)) 1 照承诺的那样工作。就像这样 > (cons 1 [2 3 4]) (1 2 3 4) > (cons 1 '(2 3 4)) (1 2 3 4) 我随机尝试使用peek查看cons的结果: 发生了什么事?我发现cons并不像它声称的那样简单地返回序列。我猜它会返回一个惰性序列,因为: > (type (cons 1 [2 3 4])) cloj

我是克洛朱尔·努布。玩列表和向量

> (peek [1 2 3 4])
4
> (peek '(1 2 3 4))
1
照承诺的那样工作。就像这样

> (cons 1 [2 3 4])
(1 2 3 4)
> (cons 1 '(2 3 4))
(1 2 3 4)
我随机尝试使用peek查看cons的结果:


发生了什么事?

我发现cons并不像它声称的那样简单地返回序列。我猜它会返回一个惰性序列,因为:

> (type (cons 1 [2 3 4]))
clojure.lang.Cons
我找到了实现它的方法

> (peek (into [] (cons 1 '(2 3 4))))
4
关于:


我发现
cons
并不能简单地返回序列 就像它声称的那样

是:
cons
始终返回一个序列:

  • cons
    返回一个
    clojure.lang.cons
  • 它扩展了ASeq
  • 它实现了ISeq
我猜它会返回一个惰性序列

Cons
决不是一个惰性序列。它可能被包装成一个惰性序列。它的尾巴可能是一个懒惰的序列。但它本身并不是一个懒惰的序列


关于你的问题:


peek
不适用于
cons
,因为
peek
需要
IPersistentStack
:一个
cons
无法实现的接口。就我所知,它很可能

是的,但我认为更重要的是,
peek
cons
与不同的抽象相关,所以不应该这样混合它们
peek
用于将持久集合视为“堆栈”,而
cons
用于构造seq。请参见
first
last
。另请参见
conj
,了解如何将项目添加到集合(包括堆栈)。
> (peek (into [] (cons 1 '(2 3 4))))
4