Common Lisp有return-from; return当你想从函数中提前返回时,有什么类型的Clojure吗?
Ben*_*itz 38
当你需要提前摆脱计算时,你需要一种方法来做到这一点,而不是纯粹主义者的论据.通常在缩小大集合时需要它,并且某个值表示进一步处理集合没有意义.为此,实用的Clojure提供了这项reduced功能.
一个简单的例子就是当乘以一个数字序列时,如果遇到零,你已经知道最终结果将为零,所以你不需要查看序列的其余部分.以下是您使用以下代码进行编码的方式reduced:
(defn product [nums]
(reduce #(if (zero? %2)
(reduced 0.0)
(* %1 %2))
1.0
nums))
Run Code Online (Sandbox Code Playgroud)
reduced在sentinel数据结构中包含您提供的值,以便reduce知道停止从集合中读取并立即返回reduced值.嘿,这是纯粹的功能,甚至!
你可以看到,如果你包裹上面发生了什么事if在do用(println %1 %2):
user=> (product [21.0 22.0 0.0 23.0 24.0 25.0 26.0])
1.0 21.0
21.0 22.0
462.0 0.0
0.0
user=> (product [21.0 22.0 23.0 24.0 25.0 26.0])
1.0 21.0
21.0 22.0
462.0 23.0
10626.0 24.0
255024.0 25.0
6375600.0 26.0
1.657656E8
Run Code Online (Sandbox Code Playgroud)
Joo*_*aat 25
在clojure中没有任何明确的return语句.如果你愿意的话,你可以使用catch/throw组合来破解某些东西,但是由于clojure比普通的lisp功能更强大,你实际上需要在一些嵌套块的中间提前返回的可能性远小于CL.我能看到返回语句的唯一"好"理由是当你以一种在clojure中不惯用的方式处理可变对象时.
我不会说它永远不会有用,但我想在Clojure中,如果你的算法需要一个return语句,那就是一个主要的代码味道.
Chu*_*uck 18
除非您正在编写一些非常时髦的代码,否则您希望提前返回的唯一原因是,如果满足某些条件.但是因为函数总是返回最后一个表单的结果,if所以已经是这个函数 - 只需要将你想要返回的值放在if它的正文中,如果符合条件,它将返回该值.
Die*_*lla 15
我不是Clojure的专家,但它似乎没有那些构造试图更具功能性.看看Stuart Halloway 在这里说的话:
Common Lisp还支持从函数中间"返回"返回宏.这鼓励了Clojure不鼓励的强制性编程风格.
但是,您可以以不同的方式解决相同的问题.这是返回示例,以函数样式重写,因此不需要返回:
(defn pair-with-product-greater-than [n]
(take 1 (for [i (range 10) j (range 10) :when (> (* i j) n)] [i j])))
Run Code Online (Sandbox Code Playgroud)
也就是说,使用延迟序列并根据条件返回值.