Clojure:帖子前功能

时间:2012-05-28 01:40:21

标签: clojure

上下文

我知道http://blog.fogus.me/2009/12/21/clojures-pre-and-post/

我想要的并不完全是前/后条件。

我希望有一个完全执行的函数前/后。

我没有看到任何文件向我承诺这个关于前/后条件的功能(即它们没有多次执行。)

问题

对于Clojure函数,无论如何用前/后函数标记它只执行一次,

  • 调用函数时的预函数
  • 函数返回时的post函数

谢谢!

2 个答案:

答案 0 :(得分:2)

你可以通过更高阶函数相对容易地做到这一点:

(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

答案 1 :(得分:0)

Dire就是这样做的。在评估函数之前调用所有前提条件谓词。如果谓词都返回true,则函数将进行求值。否则会引发异常。对所有后置条件谓词的评估如下。