Эволюция изображения - PullRequest
       8

Эволюция изображения

11 голосов
/ 19 февраля 2011

Мне нравится идея языков на основе изображений, и в последнее время я играю с Common Lisp через sbcl.В нескольких местах я читал о том, как благодаря возможности сохранять и загружать образ виртуальной машины можно создавать приложения или набор приложений, работающих на этом образе.

Я понимаю, как загрузитьКод в изображение и его запуск, слизь делает такие вещи очень хорошими, но у меня такой вопрос: как я могу сказать, какие функции определены в изображении?Допустим, я хочу обновить функцию через несколько дней или месяцев после ее запуска, и я не могу вспомнить название.Есть ли способ получить код или даже просто имена функций, определенных на изображении?

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

Ответы [ 2 ]

13 голосов
/ 19 февраля 2011

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 есть много возможностей в этой области.

5 голосов
/ 23 февраля 2011

Вы также можете использовать do-символы или do-external-символы, если вы предпочитаете:

пример:

>> (do-external-symbols (s (find-package :foo-package)) (print s))

FOO-PACKAGE:XXX
FOO-PACKAGE:YYY
FOO-PACKAGE:ZZZ
NIL

Где XXX, YYY и ZZZ - все внешние символы в пакете:. Foo-пакет

...