【发布时间】:2018-03-10 15:42:06
【问题描述】:
我是 Clojure 的新手,正在尝试简洁地编写一个递归函数来将两个排序的序列合并为一个新的排序序列。
这是我的尝试,无法编译:
(defn seq-merge [a-seq b-seq]
(cond
(empty? a-seq) b-seq
(empty? b-seq) a-seq
:else (let (if (< (first a-seq) (first b-seq))
[f (first a-seq) r (rest a-seq) h b-seq]
[f (first b-seq) r (rest b-seq) h a-seq])
(cons f (seq-merge r h)))))
最初,我想要类似的东西:
(if condition
(let [...]
(let [...]
(code-that-uses-conditional-bindings))
但似乎每个“让”都需要直接跟在代码后面,所以这不起作用。
如果可以避免的话,目标是不必重复 (cons f (seq-merge r h)) 行两次。
我目前的解决方案是这样的:
(defn seq-merge [a-seq b-seq]
(cond
(empty? a-seq) b-seq
(empty? b-seq) a-seq
:else (let [a-low? (< (first a-seq) (first b-seq))
f (if a-low? (first a-seq) (first b-seq))
r (if a-low? (rest a-seq) (rest b-seq))
h (if a-low? b-seq a-seq)]
(cons f (seq-merge r h)))))
但是对于每个绑定值都有一个“if”,这似乎更加笨拙。
【问题讨论】:
-
@marco.m 我认为这些对这里没有帮助,马可。如果您查看the source code,如果要绑定的表达式为假,则没有绑定。
标签: if-statement clojure let