Стандарт Common Lisp очень мало говорит об этих вещах. Например, упоминается, что функция ed
может принять имя функции , а затем открыть редактор с соответствующим исходным кодом. Но механизм не указан, и эта возможность полностью предоставляется средой разработки, возможно, в сочетании с системой Lisp.
Типичным способом решения этой проблемы является компиляция файла, и компилятор записывает исходное местоположение определенного объекта (функция, переменная, класс и т. Д.). Исходное местоположение может быть, например, помещено в список свойств символа (название определенной вещи) или записано в каком-либо другом месте. Также фактический исходный код в виде структуры списка может быть связан с символом Lisp. Смотрите функцию FUNCTION-LAMBDA-EXPRESSION
.
Некоторые реализации делают более сложную запись местоположения источника. Например, LispWorks может найти определенную часть функции, которая в данный момент выполняется. Он также отмечает, когда определение приходит от редактора или слушателя. См. Dspecs: Инструменты для обработки определений . Затем отладчик может, например, определить, где находится код определенного фрейма стека в источнике.
SBCL также имеет функцию найти исходный код .
Обратите внимание также, что фактический «исходный код» в Common Lisp - это не всегда текстовый файл, а читаемое s-выражение. eval
и compile
- две стандартные функции - не принимают строки или имена файлов в качестве аргументов. Они используют фактические выражения:
CL-USER 26 > (compile 'foo (lambda (x) (1+ x)))
FOO
NIL
NIL
CL-USER 27 > (foo 41)
42
S-выражения в виде кода не привязаны к какому-либо конкретному текстовому форматированию. Их можно переформатировать с помощью симпатичной функции принтера pprint
, и это может учитывать доступную ширину для создания макета.
Таким образом, отметив, что структура может быть полезной, и было бы менее полезно записывать строки источника.