Clojure是否具有在调用时执行body函数的“恒定”形式?

时间:2018-09-12 08:05:14

标签: clojure

我想在测试中使用constantly为引发异常的场景建模。在读取代码而不执行代码时,将不断使用现成的主体进行评估。即我不能这样做:

(def x (constantly (throw (Exception. "X"))))
(x 1 2 3)

相反,throw立即发生。

这有效:

(defn x [&] (throw (Exception. "X")))

但是constantly如此方便和惯用,我想知道是否有内置的等效功能(也许使用宏)?

3 个答案:

答案 0 :(得分:3)

一种选择

VARGRAPHIC

答案 1 :(得分:1)

恒定是一个功能,而不是像UIView *whiteView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [[UIScreen mainScreen] bounds].size.width, [[UIScreen mainScreen] bounds].size.width)]; whiteView.backgroundColor = [UIColor whiteColor]; [self.view addSubview:whiteView]; 这样的,因此您需要使用fn来实现一种操作。

恒定渴望评估其参数,这就是为什么它立即失败的原因。

答案 2 :(得分:0)

有几种方法可以延迟Clojure中的计算

最明显的是delay

(def x (delay (throw (ex-info "myException" {}))))
@x ;; exception is thrown

您还可以使用lambda(类似于在其他语言中必须执行的操作),或者使用惰性。

鉴于问题中的代码示例,看起来您正在寻找这样的东西:

(defn x [& args]
  (throw (ex-info "myException" {:args args})))

(try
  (x 1 2 3)
  (catch Exception e
    (println "Exception! data is "  (ex-data e))))

请注意使用ex-infoex-data可能对传递信息有用。