我正在学习clojure,我非常喜欢它。但是我来自emacs-lisp背景,在解构时我仍然有点困惑。 目前,我收到了一个包含大量密钥的数据库查询。我通过解构将它们分解为不同的变量,最后,在通过let创建几个新值之后,我将哈希映射重建为返回值。 代码如下所示:
IAdapter
这只是一个摘录,下面有许多不同的条件。所以有很多代码对我来说完全没用。 我想这很难看,当然不是应该的方式。有关如何做到这一点的任何建议吗?任何帮助都将深表感谢!
答案 0 :(得分:2)
你可以这样捕捉整个地图:
user> (defn my-fun [{:keys [a b c d e] :as params-map}]
(assoc params-map
:a 200
:b 100))
#'user/my-fun
user> (my-fun {:a 1 :b 2 :c 3 :d 4 :e 5})
{:a 200, :b 100, :c 3, :d 4, :e 5}
因此您只需更新地图中的某些特定值,而无需重新定义。
另请参阅update
,在这种情况下它可能很有用
至于我,我会像这样重写你的fn:
(移出一些函数并使用update
)
(defn update-grammar [grammar]
(apply str (map (fn [{:keys [word position line tag] }]
(str "<span class=\"dropt\">" word
"<span style=\"width:500px;\"><font color=\"green\">Word:</font>" word
"<br><font color=\"red\">Function:</font> " tag
"<br><font color=\"blue\">Meaning:</font> " (db/get-chindic-meaning word tag)
"</span></span>")) grammar)))
(defn update-trans [trans] (first (map #(last (last %)) trans)))
(fn [{:keys [metre _id num filedate divtype section
sandhi lines grammar devanagari filename
notes trans sectionnumber fileauthor lang]
:as params-map}]
(cond
;;when we have chinese
(= lang "zh")
(-> params-map
(update :grammar update-grammar)
(update :trans update-trans))
您知道,现在您甚至可以从grammar
向量中移除trans
和:keys
,因为您不再需要它们