Есть ли команда, чтобы остановить интерпретатор в Common Lisp?

Я ищу выражение, которое заставит интерпретатор выйти, когда он будет оценен.

Я нашел много специфичных для реализации, но ни один из них в HyperSpec, и мне было интересно, есть ли какие-то, что я не видел в спецификации. Я обнаружил, что (quit) распознается как CLISP, так и SLIME, а (exit) распознается только CLISP, но я не могу найти документацию, которая ссылается на любой из них.

Ответы

Ответ 1

Насколько я знаю, это не распространяется на Spec, и вам придется использовать решения, специфичные для реализации, или, может быть, попытаться посмотреть, кто-то уже написал тривиально-личную библиотеку (или запустил ее на CLiki).

Если вы только заботитесь об интерактивном использовании, ,q в SLIME всегда будет делать правильные вещи. В противном случае вы можете использовать условия времени чтения, такие как:

(defun my-quit ()
  #+sbcl (sb-ext:quit)
  #+clisp (ext:exit)
  #+ccl (ccl:quit)
  #+allegro (excl:exit)) ;; and so on ...

#+ проверяет, находится ли следующий символ в *features*. Если нет, следующая форма будет рассматриваться как пробел. (Существует также #- для противоположного).

Ответ 2

Так как большинство Lisps импортируют функцию quit в CL-USER, CL-USER:: QUIT - это хорошее предположение, не зная конкретного пакета реализации, где он находится.

(cl-user::quit)

Обратите внимание на два двоеточия, так как QUIT не нужно экспортировать из пакета CL-USER.

Ответ 3

Нет стандартного способа выхода из среды CL. Чтобы узнать, как это сделать в реализации, которую вы используете, прочитайте ее документацию.

В sbcl, (sb-ext:quit) выполнит трюк. Для clisp это (ext:exit). Сводная документация для команды находится в http://clisp.sourceforge.net/impnotes.html#quit