5

我的想法是这样的:

(run (long-calculation vars) time-limit)

它返回(long-calculation vars)nil如果time-limit达到的结果。

4

3 回答 3

1

我建议使用 bordeaux-threads,为计算生成一个线程,如果计时器没有返回,则获取线程并返回 nil。

于 2011-09-20T17:54:48.233 回答
1

如果您可以找到amb运算符的实现,那么您可以执行以下操作:

(defmacro run (comp time-limit)
  `(amb comp
       (progn (delay ,time-limit)
              nil)))

请注意不要将其与 McCarthyamb运算符混淆。amb应该在单独的线程中评估它的两个参数并选择先完成的那个。例如,在 Haskell 中,它在Data.Unamba中进行了描述。

于 2011-09-16T16:27:41.443 回答
1

在野外发现这个 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)

希望这将帮助您不必推出自己的。

于 2011-11-07T23:07:29.617 回答