gpt4 book ai didi

clojure - 为什么 conj 和 cons 的参数顺序不同

转载 作者:行者123 更新时间:2023-12-02 10:49:31 26 4
gpt4 key购买 nike

conj中,原始集合是第一个参数,在cons中,它是第二个参数

我是 clojure 新手,这看起来有点令人困惑。这两个函数有相似的行为,但是为什么参数顺序不同,是故意这样设计的吗?

(conj '(1 2 3) 4)
; => (4 1 2 3)

(cons 4 '(1 2 3))
; => (4 1 2 3)
<小时/>

我知道这两个函数是不同的,但是为什么 conjcons 将原始集合以不同的参数顺序放置。

最佳答案

cons传统上意味着构造新对象,将第一个参数添加到第二个参数中,这就是参数的排序方式。

这里引用了 LISP 的缺点,

In LISP jargon, the expression "to cons x onto y" means to construct a new object with (cons x y)

但是conjoin通常是附加在给定的数据结构上但取决于您使用的clojure数据类型。这就是为什么首先是集合,然后是要附加的元素。

让我们看看向量

user=> (type [3 5 7 11])
clojure.lang.PersistentVector

user=> (cons 1 [3 5 7 11])
(1 3 5 7 11)

user=> (conj [3 5 7 11] 13)
[3 5 7 11 13]

但是对于Listconjoin也会前置,

user=> (type '(3 5 7 11))
clojure.lang.PersistentList

user=> (cons 1 '(3 5 7 11))
(1 3 5 7 11)

user=> (conj '(3 5 7 11) 13)
(13 3 5 7 11)

doc for conj也描述了这一点。

user=> (doc conj)
-------------------------
clojure.core/conj
([coll x] [coll x & xs])
conj[oin]. Returns a new collection with the xs
'added'. (conj nil item) returns (item). The 'addition' may
happen at different 'places' depending on the concrete type.
nil

据我所知,该命令适用于任何其他函数式语言。这是在 scala 中;

scala> 1 +: Seq(1, 3, 5)
res1: Seq[Int] = List(1, 1, 3, 5)

scala> Seq(1, 3, 5) :+ 7
res2: Seq[Int] = List(1, 3, 5, 7)

关于clojure - 为什么 conj 和 cons 的参数顺序不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48513617/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com