Глобальные специальные переменные
Поскольку глобальные переменные используют динамическое связывание, их можно перепривязать:
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.