2017-08-05 43 views
2

Clojure noob here。玩弄列表和向量。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 1 [2 3 4])) 
ClassCastException clojure.lang.Cons cannot be cast to clojure.lang.IPersistentStack clojure.lang.RT.peek (RT.java:724) 

这是怎么回事?

回答

1

的这样关于your answer

周围玩,我发现cons不直接返回一个序列 像它声称。

是它:cons总是返回一个序列:

  • cons返回clojure.lang.Cons
  • 延伸ASeq
  • 它实现ISeq

我的猜测是,它返回一个懒惰的序列......

一个Cons从来都不是一个懒惰的序列。它可能被包装在一个懒惰的序列中。它的尾巴可能是一个懒惰的序列。但它本身并不是一个懒惰的序列。


关于你的问题:即Cons没有实现一个接口:

peek因为peek需要IPersistentStack不上cons工作。据我所知,这很可能。

2

玩耍时我发现cons并没有像它声称的那样清楚地返回一个序列。我的猜测是,它返回一个懒惰的序列,因为:

> (type (cons 1 [2 3 4])) 
clojure.lang.Cons 

我发现自知

> (peek (into [] (cons 1 '(2 3 4)))) 
4 
+2

对,但我认为更重要的是'peek'和'cons'与不同的抽象有关,所以你不应该这样混合它们。 'peek'用于将持久性集合*视为'堆栈','cons'用于构造* seqs *。见'第一个'和'最后一个'。 – glts

+0

@glts有道理,谢谢 – uKolka

+2

另请参阅'conj'用于将项目添加到集合(包括堆栈)。 – amalloy