Есть ли команда, чтобы остановить интерпретатор в 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
Ответ 4
Существует библиотека ASDF, называемая shut-it-down, которая предоставляет функцию quit
которая работает, просто имея случаи для распространенных реализаций CL.