Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 使用dissoc';什么是一元版本?_Clojure_Arity - Fatal编程技术网

Clojure 使用dissoc';什么是一元版本?

Clojure 使用dissoc';什么是一元版本?,clojure,arity,Clojure,Arity,在使用dissoc时,我注意到它有一个一元版本,它似乎没有任何作用。我检查了源代码,结果发现它只是标识函数: (defn dissoc ([map] map) ([map key] (. clojure.lang.RT (dissoc map key))) ([map key & ks] (let [ret (dissoc map key)] (if ks (recur ret (first ks) (next ks)) re

在使用dissoc时,我注意到它有一个一元版本,它似乎没有任何作用。我检查了源代码,结果发现它只是标识函数:

(defn dissoc
  ([map] map)
  ([map key]
   (. clojure.lang.RT (dissoc map key)))
  ([map key & ks]
   (let [ret (dissoc map key)]
     (if ks
       (recur ret (first ks) (next ks))
       ret))))
然后我注意到
disj
也有一个一元版本,具有相同的定义

一元版本的目的是什么?我能看到的唯一潜在用途可能是当它们与
apply
一起使用时,但我看不出这有什么用处。为什么它们的
conj
assoc
对应项没有类似的一元版本呢?

考虑
(应用dissoc删除一些映射项)


如果一元表单不存在,
要删除的项
为空将是一个错误,因此在进行此调用之前需要始终检查其长度。

考虑
(应用dissoc一些要删除的映射项)
。当要删除的
项为空时,您真的希望它是一个错误,从而迫使任何使用该习惯用法的人将其包装在条件中吗?这与
+
的0参数和1参数版本完全相同。@CharlesDuffy这是一个很好的观点。我想它没有点击,因为我以前从未在任何函数上使用过
apply
。如果你写一个答案,我会接受的。因此,
conj
assoc
也应该是一元身份。JIRA罚单会招手吗?@thumboil我想说,任何使用
apply
conj
的用法都应该被替换为。对于将
apply
assoc
一起使用,它似乎并不那么简单;您可以使用
#(进入%1(映射向量(所有2%2分区))
,但这相对较长。@Thumbnail
conj
自1.7.0以来一直有一元重载。它在
(docconj)
中被模糊了,同时引入的空值重载也是如此。通过更新
:arglists
(带有补丁)来修复此问题的票据:@SamEstep
可能更可取,Sam。但这是一个不同的问题。关键在于一致性和一致性。如果
conj
(或
assoc
)在第一个参数之后接受多个(对)参数,它应该不接受任何参数:
conj
接受,而
assoc
不接受<代码>列表*
-是
cons
的扩展,只接受一个参数。@MichałMarczyk谢谢。以后我就不会那么轻信了。