为什么结合和缺点有不同的论点顺序

Hun*_*ger 3 clojure

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

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

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

(cons 4 '(1 2 3))
; => (4 1 2 3)
Run Code Online (Sandbox Code Playgroud)

我知道这两个函数是不同的,但为什么conj并将cons原始集合放在不同的参数顺序中.

pra*_*upd 5

cons 传统上意味着构造新对象,将第一个arg预先添加到第二个arg,以及args是如何排序的.

以下是LISP cons的引用,

在LISP术语中,表达"将x缩写为y"意味着构造一个新的对象 (cons x y)

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

让我们看看Vector;

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]
Run Code Online (Sandbox Code Playgroud)

但是,对于List,conjoinprecesnds,

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)
Run Code Online (Sandbox Code Playgroud)

文档也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
Run Code Online (Sandbox Code Playgroud)

据我所知,该订单适用于任何其他功能语言.这是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)
Run Code Online (Sandbox Code Playgroud)