2

私はしばらくの間、この小さな Clojure スニペットと格闘してきましたが、もっと慣用的で単純なアプローチがあると感じ続けていました。

望ましい行動; "1" -> true、"0" -> false に変換します。それ以外の場合は、引数をそのまま返します。

(= (mapper {:column 0} ["monkey" "stuff"]) "monkey")
(= (mapper {:column 0} ["1" "stuff"]) true)
(= (mapper {:column 0} ["0" "stuff"]) false)

これは私の最初の試みでした。単純な命令型アプローチ:

(defn mapper 
  [attr-map row]
  (let [x (row (:column attr-map))
        y ({"1" true "0" false} x)]
    (if (nil? y) 
      x
      y)))

2 回目の試行:

(defn mapper 
  [attr-map row]
  ((comp #({"1" true "0" false} % %) row :column) attr-map))

誰でもより良い解決策を見つけることができますか?

4

2 に答える 2

5

:columnキーが標準の場合、destructuringを使用できます。

(defn mapper [{c :column :or {c 0}}
              {item c}]
  ({"1" true "0" false} item item))

使い方:

({"1" true "0" false} item item)

ハッシュマップは、値を取得するために、最初の引数がキーである関数として扱うことができます。この形式は、ハッシュマップにキーが含まれていない場合に返される 2 番目のオプションの引数も受け入れます。

{c :column :or {c 0}}

この分解形式は:column、関数の最初の引数に渡される項目へのキーとして使用します。(この場合は{:column 0}ハッシュマップです。) オプションのキーワードは、キーが存在しない場合、または引数が有効なコレクション (例: nil、数値、日付など) でない:or場合のデフォルト値を許可します。キーの値、またはデフォルト値の 0が含まれるようになります。:columnc:column

{item c}

2 番目の引数として渡されるコレクションはインデックス可能であるため、以前と同じ形式を使用できます。前の分解形式で名前が付けられた varcには の値が含まれており:column、これを使用して 2 番目の引数にインデックスを付け、結果の値を に代入できますitem


コードゴルフ:

入力引数の形式を保証できる場合は、さらに次のように縮小できます。

(fn [{i :column} {x i}] ({"1" true "0" false} x x))

于 2013-10-11T19:00:04.180 に答える