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

common lisp cons从两个符号创建一个列表,clojure cons需要一个seq to cons on?,clojure,lisp,common-lisp,sequence,cons,Clojure,Lisp,Common Lisp,Sequence,Cons,(免责声明-我知道Seqs在Clojure中的重要性) 在通用lisp中,cons函数可用于将两个符号组合成一个列表: (def s 'x) (def l 'y) (cons s l) 在clojure中-您只能在序列上使用cons-cons没有扩展到使用两个符号。所以你必须写: (def s 'x) (def l 'y) (cons s '(l)) Clojure中是否有更高层次的模式可以解释Common LISP和Clojure之间的差异?当你说 > (cons 'a 'b) 在

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

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

(def s 'x)
(def l 'y)
(cons s l)
在clojure中-您只能在序列上使用cons-cons没有扩展到使用两个符号。所以你必须写:

(def s 'x)
(def l 'y)
(cons s '(l))
Clojure中是否有更高层次的模式可以解释Common LISP和Clojure之间的差异?

当你说

> (cons 'a 'b)
在common lisp中,您不会得到一个列表,而是一个点对:
(a.b)
,而

> (cons 'a (cons 'b nil))
是点对
(a.(b.nil))


在第一个列表中,它的
cdr()
不是一个列表,因为它在这里
b
而不是
nil
,这使它成为一个不正确的列表。正确的列表必须以
nil
终止。因此,像
mapcar()
和friends这样的高阶函数不起作用,但我们保存了一个cons单元格。我猜Clojure的设计者删除了这个功能,因为它可能会引起混乱。

在Clojure中,与传统的Lisp不同,列表不是主要的数据结构。数据结构可以实现接口——这是它给出的数据结构的另一个视图——允许相同的函数访问每个接口中的元素。(列表已经实现了这一点。
seq?
检查某些东西是否实现了。
(seq?),(seq?[12])
Clojure的行为完全不同(有充分的理由),在使用
cons
时,一个由
a
(seq b)构成的序列(实际上是
Clojure.lang.cons
返回。(
a
是arg 1和
b
arg 2)显然,符号不能也不能实现

但是,请注意,
rest
已经更改,它以前的行为现在在
next
中,并且
lazy cons
已被
lazy seq
cons
取代


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

你可以把任何东西放进囚室的两个插槽里

Cons单元格用于构建列表。但是人们可以用cons单元格创建各种数据结构:树、图、各种类型的专用列表


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

Lisp列表只是使用cons单元的一种常见方式(请参阅)。Clojure最好被视为没有cons细胞(尽管类似的东西可能隐藏在引擎盖下)。Clojure
cons
是一个用词不当的词,它实际上应该被命名为
prepend
在Clojure中,最好使用两元素向量:
[:a:b]
。在引擎盖下,这些小向量被实现为Java数组,并且非常简单和快速


(cons:A'(:b))
(或
(cons:A(cons:b nil))
)的简写是
列表
(列表:A:b)

我已经用Clojure编程了一段时间,甚至都没有意识到这一点!如果你所说的是正确的,这是一个好问题:)请注意,通常使用
conj
cons
更好。有关更多详细信息,请参见我对这个问题的回答(以及cgrand的评论):(事实上,这个回答还解释了Clojure中
cons
的功能,在某种程度上与传统的Lisp
cons
形成了对比。)您的第一个示例不是列表,而是一对。一对(A.b)不同于两个元素的列表(ab),后者恰好是对(A.(b.nil))。应该注意的是,
(A.(b.nil))
是一个Lisp列表,通常称为
(ab)