【发布时间】:2011-09-16 10:46:59
【问题描述】:
我的想法是这样的:
(run (long-calculation vars) time-limit)
如果达到time-limit,则返回(long-calculation vars) 或nil 的结果。
【问题讨论】:
-
这取决于实现。你使用什么 Lisp 实现?
标签: lisp common-lisp clisp
我的想法是这样的:
(run (long-calculation vars) time-limit)
如果达到time-limit,则返回(long-calculation vars) 或nil 的结果。
【问题讨论】:
标签: lisp common-lisp clisp
如果您可以找到 amb 运算符的实现,那么您可以执行以下操作:
(defmacro run (comp time-limit)
`(amb comp
(progn (delay ,time-limit)
nil)))
注意不要将其与 McCarthy amb 运算符混淆。 amb 应该在单独的线程中评估它的两个参数,然后选择先完成的那个。例如,在 Haskell 中,它在 Data.Unamb 中进行了描述。
【讨论】:
我建议使用 bordeaux-threads,生成一个线程进行计算,如果计时器没有返回,则获取线程并返回 nil。
【讨论】:
在野外发现这个 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)
希望这将帮助您不必推出自己的。
【讨论】: