问题:Clojure 中,如何避免懒惰的评估问题?
答案:Clojure 中的懒惰评估问题可以通过使用 delay
和 at
函数避免。delay
函数可以使得其参数在一段时间后执行,而 at
函数可以指定一个时间后执行。
例如,下面的代码中,如果 x
是一个无法解析的字符串,则在 when
语句中,x
的值会被设置为 nil
,并且 x
的值不会发生变化,直到下一次 when
语句被执行时,才会重新进行评估:
(when (or (not (string? x)) (resolve x))
(println x))
如果使用 delay
和 at
函数,则可以避免这种情况:
(delay (when (or (not (string? x)) (resolve x))
(println x)))
在上面的代码中,如果 x
是一个无法解析的字符串,则在 when
语句中,x
的值会被设置为 nil
,并且 x
的值不会发生变化,直到下一次 when
语句被执行时,才会重新进行评估。
需要注意的是,使用 delay
和 at
函数时,需要将表达式放在 delay
函数的括号中,并且需要加上括号,否则会报错。例如,下面的代码会报错:
(delay (when (or (not (string? x)) (resolve x))
(println x)))
而下面的代码则不会出现错误:
(delay[(when (or (not (string? x)) (resolve x))
(println x)])
希望这个答案能够帮助你解决 Clojure 中的懒惰评估问题。
领取专属 10元无门槛券
手把手带您无忧上云