8

クロジュアでは、

(assoc {})

アリティ例外をスローしますが、

(dissoc {})

ではない。なんで?キーまたは値が提供されていない場合、両方が例外をスローするか、両方が変更を行わないことを期待していました。

編集:これらのフォームを許可する理由がわかりました。これは、空の可能性がある引数のリストに assoc または dissoc を適用できることを意味します。なぜ一方が許可され、もう一方が許可されないのかがわかりません。私が見逃している正当な理由があるかどうかについて興味があります。

4

2 に答える 2

4

個人的には、1-arity assoc の欠如は見落としだと思います: パラメータの末尾のリストが予想されるときはいつでも ( )、関数は通常、空のリストを& stuff可能にするためにゼロ パラメータで動作できる必要があります。apply

+Clojure には、や など、引数なしで正しく動作する関数が他にもたくさんありmergeます。

一方、Clojure には、ゼロの後続パラメーターを受け入れないconj他の関数があります。

そのため、Clojure API はこの点で少し一貫性がありません.....

于 2013-04-24T13:36:13.273 に答える
0

これは正式な回答ではありませんが、私のテストと ClojureDocs の参照に基づいています。

dissocのアリティには、1 つの引数であるマップを渡すことができることが含まれます。その場合、キー/値はマップから削除されません。

(def test-map {:account-no 12345678 :lname "Jones" :fnam "Fred"})
(dissoc test-map)
{:account-no 12345678, :lname "Jones", :fnam "Fred"}

assocには同様のアリティがありません。つまり、assoc を呼び出すには、マップ、キー、および値が必要です。

なぜこれがこのように設計されたのかは別の問題です。その情報で回答が得られない場合は (そうであることを願っています)、報奨金を提供するか、Clojure の Google グループにアクセスしてその質問をすることをお勧めします。

これがソースです。

(defn dissoc
  "dissoc[iate]. Returns a new map of the same (hashed/sorted) type,
that does not contain a mapping for key(s)."
  {:added "1.0"
   :static true}
  ([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))))
于 2013-04-23T19:45:00.820 に答える