【发布时间】:2011-09-10 14:15:13
【问题描述】:
我有一个返回地图的函数。键是静态的,但值是有条件的。像这样:
(defn map-returning-function [x y]
{:a (if (some-test-fn x) "one value" "other value"
:b (if (some-test-fn x) 15 25
:c (if (different-test y) :one :two})
有没有更优雅的方法来实现这一点而无需为每个值编写if 测试?我能想到的唯一其他方法是
(defn another-map-returning-function [x y]
(if (some-test-fn x)
{:a "one value", :b 15, :c (if (different-test y) :one :two)}
{:a "other value" :b 25, :c (if (different-test y) :one :two)}))
这对我来说似乎并没有好多少,因为它重复了条件的每个分支的键名,并重复了 different-test 上的函数调用。天堂禁止我需要cond 而不仅仅是if。
【问题讨论】:
-
您当然可以编写一些巧妙的代码来消除 if.... 但是,为了避免输入三四个字符,是否真的值得额外的间接和/或复杂性?这可能是您应该应用 KISS 原则的情况。
-
@mikera:在这种情况下我同意你的看法,但我理解我简化了这个例子,以使其作为问题的一部分更清晰。我有点希望有人能搞定一些疯狂的 macro'n 技能并告诉我它是如何完成的。