2013-04-23 6 views
8

は、clojureでは、なぜassocはマップに加えて引数を必要とするのですか? Clojureので

(assoc {}) 

はアリティ例外がスローされますが、

(dissoc {}) 

はしていません。どうして?私は両方のいずれかが例外をスローするか、あるいはキーや値が与えられていないときに何も変更を加えないことを期待していました。

EDIT:これらのフォームを許可する根拠があります。おそらく空の引数リストにassocまたはdissocを適用することができます。なぜ私は誰が許されているのか、他の人が許されないのか分からないし、私には欠けている理由があるのか​​不思議だ。

+0

'(連想は、{})'したがって、それは許可されていない、意味をなさない。 – dsm

+1

'(dissoc {})'もそうではないことに注意してください。 – dsm

+3

私の主張は、どちらも意味をなさない、あるいはどちらも意味をなさないことです。 1つは許可され、もう1つは許可されません(少なくともclojure 1.5.1では)。なぜ私は興味があります。 –

答えて

4

私は個人的に1-アリティASSOCの欠如が監督だと思う:パラメータの後続リストが予想されるたびに(& stuff)、機能が正常にそれを可能にするためにゼロのパラメータを扱うことが可能であるべきです空のリストにはapplyになります。

Clojureには、ゼロ引数で正しく機能する他の多くの関数があります。 +およびmerge

一方、Clojureはが0以外の機能を持っています。はゼロの後続パラメータを受け入れます。 conj

したがってClojureのAPIは、この点で少し矛盾して.....

0

これは公式の答えではありませんが、私のテストとClojureDocsを見に基づいています。

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

(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)))) 
+0

私はこれを私の答えに加えていません。 1つのアリティは部分関数とスラッシュ演算子で使用されるように見えます。これは、(解読テストマップ)が最終的に削除のためのキーを含むフォームにスレッド化される可能性があります。しかし、これは教育的な推測であり、私はClojure知識のある人が答えることを望んでいます。 – octopusgrabbus

関連する問題