在 amalloy 评论后编辑
我不知道打嗝,我不完全理解你想要做什么。具体来说,我不明白get
你必须按照自己的意愿去做的那一行。但是,您似乎在说您想要来自以下代码块的返回值列表:
(check-box "check1")
(label "check1" "Check1")
(check-box "check2")
(label "check2" "Check2")
(check-box "check1")
(label "check3" "Check3")
(check-box "check4")
(label "check4" "Check4")
如果我是对的,那就是你想要做的,那么最简单的方法——但最不通用的方法——就是简单地将它全部包装在对 list 的调用中。但是,为了使其更通用和惯用,我会这样做:
(apply concat
(for [x [1 2 3 4]
:let [name (str "check" x)]]
[(check-box name)
(label name (capitalize name))]))
for
通过将一个(或多个)变量(在本例中为 x)绑定到序列中的一个元素,一次一个,然后循环,直到它通过所有这些元素。这样,它经过 1、2、3 和 4,然后在let
binds name to内(str "check" x)
。例如,在第一次迭代中,name 将被绑定为“check1”。剩下的就是简单地用适当的参数调用check-box
andlabel
函数。
如果你想进一步概括这一点——例如,你可能不知道你想要多少个复选框和标签——你可以像这样轻松地做到这一点:
(defn make-n-checkboxes-and-labels
[n]
(apply concat
(for [x (range 1 (inc n))
:let [name (str "check" x)]]
[(check-box name)
(label name (capitalize name))])))
在这种情况下,它现在已被泛化为一个函数,您可以执行与以前完全相同的操作,但现在通过执行以下操作:
(make-n-checkboxes-and-labels 4)
再说一次,我没有对打嗝做任何研究,所以我可能不知道你到底想做什么。此外,Timothy 可能建议(隐含地,不明确地)用关键字替换字符串。我会重申这个建议,因为关键字应该更快更好看(在这种情况下,它们也可能更惯用)。如果你想用关键字替换你的字符串,它应该是一个简单的环绕(keyword)
字符串的问题,如下所示:
(keyword (str "check" 1))
=> :check1
祝你好运!