SLIME интерактивная разработка - вставьте код в SLIME REPL! = Eval команды из буфера - PullRequest
2 голосов
/ 11 мая 2019

Я пытаюсь создать только базовый пакет с именем "a" (для изучения) с помощью asdf, который я уже определил в package.lisp, и мой основной файл a.lisp начинается с:

(in-package :a)
...

Если я разрабатываю свой модуль, я просто хотел бы запустить eval весь буфер в SLIME REPL, выполнив Mx slime-eval-buffer или что-то еще, но этого не происходит после запуска эта команда все еще в пакете cl-user:

;;; from a.lisp
A> (in-package :a)
#<PACKAGE "A">
CL-USER>     <--- should have stayed in A>

Однако, если я сам вставлю весь код в SLIME REPL, он уже работает. Вставлять много кода снова и снова не очень удобно, хотя для интерактивной разработки.

Вы можете помочь? У вас есть предложения по поводу того, что я делаю неправильно, или как вы обычно вместо этого справляетесь?

Спасибо.

Ответы [ 2 ]

6 голосов
/ 11 мая 2019

Слизь: код из буфера обычно не оценивается в ответе

Я просто хотел бы запустить весь буфер вSLIME REPL, выполняя Mx slime-eval-buffer

Модель не такова, что «вычисляется в SLIME REPL» из исходного буфера.Один оценивает код в подключенном Лиспе.Этот подключенный Lisp может порождать поток для каждого запроса оценки.

Например, вы можете видеть, что после оценки буфера обычные переменные REPL, такие как * (последний результат), не обновляются.

Когда вы вставляете код в буфер REPL, вы выполняете его оттуда, и он выполняет код в REPL.

Слизь: фактически выполняет оценку из буфера в REPL

Вы можете оценить код из буфера Lisp в REPL.Смотрите команду c-u m-x slime-eval-last-expression-in-repl или короче c-u c-c c-j.Модификатор c-u вызывает немного другое поведение с пакетами:

  1. переключение на буфер REPL
  2. переключение на пакет исходного буфера
  3. оценка исходного кода вREPL (включая настройку переменных REPL)
  4. печатать результат в буфере REPL (включая настройку переменных REPL)
  5. не переключать REPL обратно в его более ранний пакет

Примечание : это поведение характерно для SLIME и не обязательно, как ведут себя другие среды.

4 голосов
/ 11 мая 2019

Так не работает. Форма in-package является инструкцией для читателя, поэтому формы в буфере после этого читаются в этом пакете. Фактически, когда вы делаете C-c C-c (slime-compile-defun), он будет искать предыдущую форму in-package независимо от того, была ли она оценена или скомпилирована каким-либо образом.

В противном случае это могло бы привести к путанице в ошибках, поскольку вы могли (и часто могли) случайно скомпилировать вещи в неправильном пакете из-за некоторого изменения порядка взаимодействия.

Чтобы переключить пакет в REPL, вы можете выполнить in-package форму там или использовать ярлык SLIME C-c ~ из буфера (который также переключает текущий каталог) .

...