【问题标题】:Clojure. Vectors and Lists. cons and peek克洛朱尔。向量和列表。缺点和偷看
【发布时间】:2018-01-13 12:08:30
【问题描述】:

这里是 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)

我随机尝试对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)

发生了什么事?

【问题讨论】:

    标签: clojure


    【解决方案1】:

    关于your answer

    我发现cons 并没有明确返回一个序列 就像它声称的那样。

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

    • cons 返回一个 clojure.lang.Cons
    • 扩展ASeq
    • 实现ISeq

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

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


    关于你的问题:

    peek 不适用于cons,因为peek 需要IPersistentStackCons 未实现的接口。据我所知,它很可能。

    【讨论】:

      【解决方案2】:

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

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

      我找到了这种实现方式

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

      【讨论】:

      • 对,但我认为更重要的是peekcons是不同的抽象相关,所以你不应该这样混用。 peek 用于将 persistent collections 视为“堆栈”,cons 用于构造 seqs。见firstlast
      • 另请参阅conj 以将项目添加到集合(包括堆栈)。
      猜你喜欢
      • 2014-06-06
      • 2018-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多