gpt4 book ai didi

clojure - 我可以在 Clojure 中混合后置条件和递归函数吗?

转载 作者:行者123 更新时间:2023-12-01 17:51:13 24 4
gpt4 key购买 nike

是否可以在同一个 Clojure 函数中同时使用递归和后置条件功能?我希望使用后置条件抛出异常,但 Clojure 似乎试图以某种方式在 recur 之后包装抛出异常的代码,因此(就像一个愚蠢的例子)这样的函数无法被评估。

(defn countup [x]
{:pre [(>= x 0)]
:post [(>= % 0)]}
(if (< x 1000000)
(recur (inc x))
x))

我现在使用的是 Clojure 1.3。

最佳答案

如果您查看 https://github.com/clojure/clojure/blob/35bd89f05f8dc4aec47001ca10fe9163abc02ea6/src/clj/clojure/core.clj#L4580-L4585defn 的实现您将看到函数体被修改,以便尾部调用被推出尾部位置。解决这个问题的一种方法是使用辅助函数来调用递归函数并在其上放置后置条件:

(defn- countup* [x]
(if (< x 1000000)
(recur (inc x))
x))

(defn countup [x]
{:pre [(>= x 0)]
:post [(>= % 0)]}
(countup* x))

(countup 999999)
;=> 1000000

(countup -1)
; Assert failed: (>= x 0)

关于clojure - 我可以在 Clojure 中混合后置条件和递归函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4183619/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com