我的想法是这样的:
(run (long-calculation vars) time-limit)
它返回(long-calculation vars)
或nil
如果time-limit
达到的结果。
我的想法是这样的:
(run (long-calculation vars) time-limit)
它返回(long-calculation vars)
或nil
如果time-limit
达到的结果。
我建议使用 bordeaux-threads,为计算生成一个线程,如果计时器没有返回,则获取线程并返回 nil。
如果您可以找到amb
运算符的实现,那么您可以执行以下操作:
(defmacro run (comp time-limit)
`(amb comp
(progn (delay ,time-limit)
nil)))
请注意不要将其与 McCarthyamb
运算符混淆。amb
应该在单独的线程中评估它的两个参数并选择先完成的那个。例如,在 Haskell 中,它在Data.Unamba中进行了描述。
在野外发现这个 lisp 代码似乎可以满足您的要求:
http://www.eurogaran.com/downloads/lisp/limitools/limitime.lsp
我启动了“Clozure Common Lisp Version 1.7-r14925M (DarwinX8664)”,将该站点中的 lisp 代码粘贴到侦听器中(全部编译),然后运行:
? (with-max-time 1 (print 5))
5
5
? (with-max-time 1 (sleep 2) (print 5))
? (quit)
希望这将帮助您不必推出自己的。