处理clojure中多个返回值的"正确"方法,其中顺序很重要

whu*_*nut 3 vector clojure

我正在使用打嗝生成一些复选框,后跟标签.原始代码如下所示:

(check-box "check1")
(label "check1" "Check1") 
(check-box "check2")
(label "check2" "Check2")
(check-box "check1")
(label "check3" "Check3")
(check-box "check4")
(label "check4" "Check4")
Run Code Online (Sandbox Code Playgroud)

经过大量的修修补补,我得到了以下几点:

(map
    (fn [x]
        (map
            #(get (vector
                (check-box x)
                (label x (capitalize x)))%)
            [0 1]))
    ["check1" "check2" "check3" "check4"])
Run Code Online (Sandbox Code Playgroud)

哪个有效,但我觉得我不是在一个非常类似于/优化/正确的等等.方式 - 特别是返回一个向量只是为了用get来挖出这些值.有一个更好的方法吗?

Tim*_*dge 11

也许解构是你需要的?

(defn multi-return-fn []
  [:1 :2 :3])

(let [[x y z] (multi-return-fn)]
    (println x)
    (println y)
    (println z))
Run Code Online (Sandbox Code Playgroud)

解构也适用于fn参数,循环,for循环等.


ama*_*loy 5

正如其他人所指出的那样,你的问题不是很明确,但在正常的Hiccup应用程序的上下文中,假设你可能需要以下是合理的:

(apply concat
       (for [boxnum (range 1 5)
             :let [lower-name (str "check" boxnum)
                   upper-name (str "Check" boxnum)]]
         [(check-box lower-name)
          (label lower-name upper-name)]))
Run Code Online (Sandbox Code Playgroud)

还有很多其他方法可以写出来; 这个人在冗长而清晰的一面犯错,而不是简洁.