Запускает автоматическую настройку Slime в пользовательском REPL

#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. Я использую свой пользовательский репозиторий, чтобы «играть в игру», то есть перемещаться по игровому дереву. Входные данные, которые не включены в мои команды, оцениваются нормально, чтобы помочь в отладке. Таким образом, я могу просматривать игровое дерево во время запуска игры.