Как реализовать механизм исполнения с ограниченным временем в CLISP? - PullRequest
5 голосов
/ 16 сентября 2011

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

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

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

Ответы [ 3 ]

1 голос
/ 20 сентября 2011

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

1 голос
/ 08 ноября 2011

Нашел этот дикий код в дикой природе, который, кажется, делает то, что вы хотите:

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)

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

1 голос
/ 16 сентября 2011

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

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

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

...