Как реализовать механизм выполнения с ограничением по времени в CLISP?

Я имею в виду что-то вроде:

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

который возвращает результат (long-calculation vars) или nil, если достигнуто time-limit.


person matejch    schedule 16.09.2011    source источник
comment
Это зависит от реализации. Какую реализацию Лиспа вы используете?   -  person Vsevolod Dyomkin    schedule 08.11.2011


Ответы (3)


Если бы вы могли найти реализацию для оператора amb, вы могли бы сделать что-то вроде этого:

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

Будьте осторожны, чтобы не перепутать это с оператором McCarthy amb. amb должен оценивать оба своих аргумента в отдельных потоках и выбирать тот, который завершится первым. Например, в Haskell это описано в Data.Unamb.

person Peteris    schedule 16.09.2011
comment
Спасибо. На самом деле я надеялся на реализацию amb :) Или указатель на существующую библиотеку. - person matejch; 18.09.2011

Я бы предложил использовать бордо-потоки, порождая поток для вычислений, и, если он не возвращается по таймеру, пожинать поток и возвращать nil.

person Paul Nathan    schedule 20.09.2011

Нашел этот код 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)

Надеюсь, это поможет вам избавиться от необходимости развертывать свои собственные.

person Clayton Stanley    schedule 07.11.2011