Почему «пакет» слизи отличается от нижнего липа? - PullRequest
0 голосов
/ 28 июня 2018

Думаю, у меня нет четкого понимания того, как слизь запускает липы в Emacs.

Скажите, у меня есть файл со следующими записями: -

(defpackage "TEST"
  (:use "COMMON-LISP"))
(in-package "TEST")
*package*

Теперь я компилирую / запускаю эти три слова, скажем

C-c C-c
C-x C-e

и я получаю вывод: -

#<PACKAGE "TEST">

Однако, если я теперь переключу буферы на нижний буфер lisp и наберу

*package*

это дает мне вывод как

#<PACKAGE "COMMON-LISP-USER">

Что дает? Использование приведенных выше команд slime явно что-то делает, но, похоже, это не влияет на основной цикл REPL для подчиненного списка.

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Глобальные специальные переменные

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

CL-USER> *package*
#<The COMMON-LISP-USER package, 117/256 internal, 0/4 external>
CL-USER> (defpackage "TEST"
           (:use "COMMON-LISP"))
#<The TEST package, 0/16 internal, 0/16 external>
CL-USER> (let ((*package* (find-package "TEST")))
           (intern "FOO"))

Так что вам не нужно устанавливать глобальные переменные, вы можете связать их.

Таким образом, что-то вроде SLIME может связать их и выполнить код для оценки внутри привязок переменных отскока:

(let ((*package* (find-package "FOO")))
  (eval (read-from-string some-string-with-code)))

Поток локальных глобальных специальных переменных

Можно также создавать потоки, чтобы они имели свои собственные глобальные переменные «локальные потоки»:

(sb-thread:make-thread (lambda (*package*)
                                    ...)
                       :arguments (list *package*))

Функция над потоком будет иметь собственную *package* привязку переменной.

IDE и глобалы

Обычно требуется, чтобы среда IDE использовала глобальные переменные в текущем потоке слушателя (каждый поток слушателя должен иметь свои собственные глобальные переменные).

Также нужно, чтобы при оценке из буфера кода Lisp редактора использовался пакет из этого буфера (обычно это пакет, определенный сверху или пакет из ближайшего IN-PACKAGE выше в коде. Редактор также может установить пакет для использования в текущем буфере кода Lisp.

Тогда IDE будет использовать что-то подобное во время оценки: связать переменную *package* и / или использовать несколько потоков с их собственной привязкой переменной *package* в каждом потоке.

IDE и множественный нижний Лисп

Как правило, будет только один нижний Lisp, но может быть возможно иметь несколько слушателей. Некоторые IDE могут также поддерживать более одного низшего Lisp.

0 голосов
/ 29 июня 2018

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

Текущий пакет в REPL устанавливается с помощью in-package там.

Вы можете легко установить текущий пакет REPL и текущий каталог в каталог текущего буфера, используя C-c C-~.

...