#emacs #common-lisp #slime
#emacs #common-lisp #slime
Вопрос:
Я использую SLIME и EMACS для Common LISP с компилятором SBCL. Функция autodoc в SLIME, где аргументы функции отображаются в минибуфере, работает нормально.
Но когда я выполняю пользовательский REPL, подобный следующему:
(defun game-repl ()
(let ((cmd (game-read)))
(unless (eq (car cmd) 'quit)
(game-print (game-eval cmd))
(game-repl))))
Функция autodoc больше не работает. Не в буферах LISP и не в моем пользовательском REPL. Вероятно, потому, что процесс SBCL занят моим REPL (ожидает ввода) и не может связаться со SLIME.
После того, как я запускаю другой процесс SBCL с C-u M-x slime
, функция autodoc снова работает, но только в буферах LISP.
Итак, есть ли способ получить автодокументирование SLIME в моем пользовательском REPL?
Комментарии:
1. У меня это случалось несколько раз. Иногда кажется, что состояние между SWANK, Emacs и REPL каким-то образом испорчено.
2.Вы пытались запустить свой пользовательский REPL в потоке? т. Е. с
bordeaux-threads
(bordeaux-threads:make-thread #'game-repl)
Ответ №1:
Я думаю, вы правы, заключив, что серверная часть swank (в вашем процессе sbcl) занята. IIRC slime содержит как синхронные, так и асинхронные команды, и ваша game-repl
была бы синхронной командой, которая не позволяла бы асинхронным командам документации проходить на серверную часть — напротив, при составлении обычной команды в slime REPL серверная часть находится в режиме ожидания, поэтому запросы к документам могут проходить.
Но, пожалуйста, простите меня за то, что я также задаюсь вопросом, имеет ли смысл то, что вы делаете в этом конкретном случае — целью пользовательского REPL, по-видимому, является одно или оба из:
- Предоставляет ограниченный или синтетический набор команд
- Предоставляет нестандартные структуры управления / синтаксиса
и в любом случае ввод в пользовательский REPL может быть не эквивалентен обычному коду, который slime мог бы автоматически настроить для вас.
Может быть, можно было бы предоставить ограниченное пространство имен «game», в котором вы могли бы играть в обычном slime REPL, а затем также предоставить отдельный, ориентированный на производство REPL со средством чтения, которое разрешало бы доступ только к символам в этом пространстве имен? (Здесь обсуждается создание песочницы на common-lisp.)
Комментарии:
1. Я использую свой пользовательский репозиторий, чтобы «играть в игру», то есть перемещаться по игровому дереву. Входные данные, которые не включены в мои команды, оцениваются нормально, чтобы помочь в отладке. Таким образом, я могу просматривать игровое дерево во время запуска игры.