Я имею в виду что-то вроде:
(run (long-calculation vars) time-limit)
который возвращает результат (long-calculation vars)
или nil
, если достигнуто time-limit
.
Я имею в виду что-то вроде:
(run (long-calculation vars) time-limit)
который возвращает результат (long-calculation vars)
или nil
, если достигнуто time-limit
.
Если бы вы могли найти реализацию для оператора amb
, вы могли бы сделать что-то вроде этого:
(defmacro run (comp time-limit)
`(amb comp
(progn (delay ,time-limit)
nil)))
Будьте осторожны, чтобы не перепутать это с оператором McCarthy amb
. amb
должен оценивать оба своих аргумента в отдельных потоках и выбирать тот, который завершится первым. Например, в Haskell это описано в Data.Unamb.
Я бы предложил использовать бордо-потоки, порождая поток для вычислений, и, если он не возвращается по таймеру, пожинать поток и возвращать 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)
Надеюсь, это поможет вам избавиться от необходимости развертывать свои собственные.