Clojure的。矢量和列表。利弊

时间:2017-08-05 19:26:48

标签: clojure

Clojure noob在这里。玩弄清单和矢量。

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

我随机尝试对 cons 的结果使用 peek

> (peek (cons 1 [2 3 4]))
ClassCastException clojure.lang.Cons cannot be cast to clojure.lang.IPersistentStack  clojure.lang.RT.peek (RT.java:724)

发生了什么事?

2 个答案:

答案 0 :(得分:2)

在我周围玩耍后发现,利弊并没有像他声称的那样明显地返回一个序列。我的猜测是它返回一个懒惰的序列,因为:

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

我找到了实现它的方法

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

答案 1 :(得分:1)

关于your answer

  

玩弄我发现cons没有明确地返回一个序列   喜欢它声称。

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

  • cons会返回clojure.lang.Cons
  • 扩展了ASeq
  • 实现ISeq
  

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

Cons永远不是一个懒惰的序列。它可以以懒惰的顺序包裹。它的尾巴可能是一个懒惰的序列。但它本身并不是一个懒惰的序列。

关于你的问题:

peek无效cons,因为peek需要IPersistentStackCons未实现的界面。据我所见,它可以。