2017-05-26 8 views
2

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で使用されているときですが、これがどのように役立つかはわかりません。そして、なぜ彼らのconjassocの対応物も同じような単項バージョンを持っていないのですか?

+0

'(削除するにはいくつかのマップアイテムを削除する)'を考えてみましょう。本当に* items-to-removeが空のときにエラーになり、そのイディオムを使用している誰かを条件付きでラップするように強制しますか? –

+0

'+'も0引数と1引数のバージョンを持つ方法とまったく同じです。 –

+0

@CharlesDuffyそれは良い点です。以前は関数のどれにも 'apply'を使ったことがないので、クリックしなかったと思います。あなたが答えを書くなら、私はそれを受け入れます。 – Carcigenicate

答えて

5

(apply dissoc some-map items-to-remove)を検討してください。

単項形式が存在しない場合は、items-to-removeが空になるとエラーとなるため、この呼び出しを行う前に常に長さを確認する必要があります。

+0

これは、 'conj'と' assoc'は単なるアイデンティティーでなければなりません。 JIRAのチケットが聴けますか? – Thumbnail

+0

@Thumbnail私は、 'conj'で' apply'を使用する場合、['into'](https://clojuredocs.org/clojure.core/into)に置き換えるべきだと言います。 'assoc'で' apply'を使うためには、それほど単純ではないようです。あなたは '#(%1(map-vec(partition-all 2%2)))')を使用することができますが、それは比較的長くなります。 –

+2

@Thumbnail 'conj'は1.7.0以来単なるオーバーロードを持っていました。同時に導入された無駄なオーバーロードと同様に '(doc conj)'では不明瞭です。 ':arglists'(パッチあり)を更新して修正するチケット:https://dev.clojure.org/jira/browse/CLJ-2169 –

関連する問題