语境
我知道http://blog.fogus.me/2009/12/21/clojures-pre-and-post/
我想要的不完全是前置/后置条件。
我想要只执行一次的前/后功能。
我没有看到任何文档向我承诺关于前置/后置条件的这个功能(即它们没有被多次执行。)
问题
对于 Clojure 函数,无论如何都要用只执行一次的前/后函数来标记它,
- 调用函数时的 pre 函数
- 函数返回时的 post 函数
谢谢!
我知道http://blog.fogus.me/2009/12/21/clojures-pre-and-post/
我想要的不完全是前置/后置条件。
我想要只执行一次的前/后功能。
我没有看到任何文档向我承诺关于前置/后置条件的这个功能(即它们没有被多次执行。)
对于 Clojure 函数,无论如何都要用只执行一次的前/后函数来标记它,
谢谢!
您可以使用高阶函数相对轻松地做到这一点:
(defn wrap-fn [function pre post]
(fn [& args]
(apply pre args)
(let [result (apply function args)]
(apply post (cons result args)))))
(def f
(wrap-fn
+
#(println (str "Calling function with args: " %&))
#(println (str "Returning with result: " (first %&)))))
(f 2 3)
Calling function with args: (2 3)
Returning with result: 5
Dire正是这样做的。在评估函数之前调用所有前置条件谓词。如果谓词全部返回 true,则函数计算。否则会引发异常。所有后置条件谓词的评估如下。