Common Lisp имеет идею пакетов .Пакеты являются своего рода реестром символов и используются как пространства имен для символов.Вы можете запросить у Common Lisp список всех пакетов.
CL-USER 1 > (list-all-packages)
(#<The SQL-COMMON package, 0/4 internal, 28/32 external>
#<The LOOP package, 245/256 internal, 3/4 external>
#<The COMM package, 0/4 internal, 940/1024 external>
#<The REG package, 41/64 internal, 0/4 external>
...)
Каждый пакет хранит интернированные символы в некоторой структуре данных.Вы можете спросить Common Lisp, какие символы встроены в пакет.
CL-USER 2 > (loop for symbol being
each external-symbol in (find-package "COMMON-LISP")
collect symbol)
(MAKE-ARRAY INVOKE-DEBUGGER STRING-TRIM ...)
Чтобы упростить это, Common Lisp предоставляет функции APROPOS и APROPOS-LIST.
CL-USER 3 > (apropos "MAKE-LOCK")
MP::INTERNAL-MAKE-LOCK (defined)
MP:MAKE-LOCK (defined)
WWW-UTILS:MAKE-LOCK (defined)
MAKE-LOCK
RESOURCES::MAKE-LOCK (defined)
MINIPROC:MAKE-LOCK (defined)
Функции, Классы,и т.д. используйте символы в качестве идентификатора.Вы также можете спросить символ, какую функцию он обозначает.
CL-USER 4 > (symbol-function 'www-utils:make-lock)
#<Function WWW-UTILS:MAKE-LOCK 41E006A69C>
Иногда Common Lisp также записывает определение функций.Тогда функция FUNCTION-LAMBDA-EXPRESSION может использоваться для извлечения 'it'.
CL-USER 5 > (defun foo (a) (* (sin a) a))
FOO
CL-USER 6 > (pprint (function-lambda-expression 'foo))
(LAMBDA (A)
(DECLARE (SYSTEM::SOURCE-LEVEL #<EQ Hash Table{0} 41403151C3>))
(DECLARE (LAMBDA-NAME FOO))
(* (SIN A) A))
Но обычно в наши дни реализации Common Lisp не используют записанные определения, а записывают местоположения источника для каждого Lisp.construct.
Большинство реализаций Common Lisp могут отслеживать исходные местоположения особым образом реализации.
Стандарт Common Lisp определяет функцию ED.
CL-USER 7 > (ed 'www-utils:make-lock)
Это вызывает редактор (внутренний или внешний) и должен открыть исходный код для этой функции.Чтобы это работало, Common Lisp должен отслеживать местоположение источника для каждой функции.Затем у редактора должен быть доступ к этому источнику.Иногда записанное местоположение является абсолютным путем /Users/joswig/lisp/utils.lisp.Если редактор хочет открыть этот файл, он должен быть доступен.Но также возможно использование логических путей , таких как http: server; utils.lisp.Затем это переводится в реальный физический путь.Этот перевод может быть позже настроен.Таким образом, можно было бы переместить Лисп на другой компьютер с разными именами путей, настроить логический путь HTTP, и тогда Лисп все равно найдет весь исходный код, даже если он находится на другом компьютере с другой структурой файловой системы.Таким образом, для его работы может потребоваться некоторая настройка.Но это очень полезная функция, и она широко используется.
Как запись исходного кода и как работает работа с исходными местоположениями зависит от реализации и является функцией соответствующего Lisp в сочетании с его средой разработки, Лучше В реализации Lisp есть много возможностей в этой области.