代码之家  ›  专栏  ›  技术社区  ›  hawkeye

common lisp cons从两个符号创建一个列表,clojure cons需要一个seq to cons on?

  •  14
  • hawkeye  · 技术社区  · 14 年前

    (免责声明-我知道Seqs在Clojure中的重要性)

    在common lisp中,cons函数可用于将两个符号组合到一个列表中:

    (def s 'x)
    (def l 'y)
    (cons s l)
    

    在clojure中-你只能在一个序列上使用cons-cons没有扩展到使用两个符号。所以你得写:

    (def s 'x)
    (def l 'y)
    (cons s '(l))
    

    5 回复  |  直到 14 年前
        1
  •  9
  •   Mike Spross Alex Martelli    14 年前

    在Clojure中,与传统的Lisps不同,列表不是主要的数据结构。数据结构可以实现 ISeq seq? 检查某物是否实现 ISeq公司 (seq? '(1 2)), (seq? [1 2])) Clojure的行为完全不同(有充分的理由),因为 cons 是一个序列(实际上是 clojure.lang.Cons )构造的 a (seq b) 已返回( 是arg1和 b arg2)显然,符号不能也不能实现 .

    Clojure.org/sequences

    Sequences screencast/talk by Rich Hickey 但是,请注意 rest next lazy-cons 已被替换为 lazy-seq 欺骗 .

    clojure.lang.RT

        2
  •  6
  •   Rainer Joswig mmmmmm    14 年前

    在公共Lisp中,CONS创建了一个所谓的CONS单元格,它类似于一个有两个插槽的记录:“car”和“cdr”。

    你可以把任何东西放进牢房的两个槽里。

    Lisp的实现经过了高度优化,以提供非常高效的cons单元。

        3
  •  3
  •   Community datashaman    7 年前

    Lisp列表只是使用cons单元格的一种常用方法(参见 Rainer's description ). Clojure最好被看作没有cons细胞(尽管类似的东西可能隐藏在引擎盖下)。克隆人 cons 是一个误称,它实际上应该只是命名 prepend .

        4
  •  3
  •   kotarak    14 年前

    在Clojure中,最好使用两元素向量: [:a :b]

    (cons :a '(:b)) (cons :a (cons :b nil)) list : (list :a :b) .

        5
  •  2
  •   user110763 user110763    14 年前

    > (cons 'a 'b)
    

    在common lisp中,您不会得到一个列表,而是一个虚线对: (a . b) ,而

    > (cons 'a (cons 'b nil))
    

    是虚线对吗 (a . ( b . nil)) .

    在第一个列表中 cdr() 这不是一个名单,因为它在这里 b 而不是 nil ,使其成为不适当的列表。适当的名单必须由 . 因此高阶函数 mapcar()