Есть ли способ узнать, из какого файла пришла форма? - PullRequest
2 голосов
/ 17 февраля 2012

Допустим, у меня есть следующее в файле с именем example.lisp.

(in-package :example)

(defparameter *global* 'bar)

(defun foo (a b) (list a b))

Есть ли функция, которая будет делать что-то вроде

> (hypothetical-function #'foo)
#P"example.lisp"

> (hypothetical-function '*global*)
#P"example.lisp"

Я специально ищудля функции или макроса, а не команды SLIME или аналогичной.Битам программы нужно знать, откуда взялись другие биты для генерации некоторой документации в сгенерированных файлах, и это похоже на то, что я должен делать, не передавая вручную исходный файл.

Ответы [ 2 ]

4 голосов
/ 17 февраля 2012

Для независимого от реализации способа взгляните на swank::find-source-location

2 голосов
/ 17 февраля 2012

Насколько мне известно, эта функциональность не является частью стандарта, но конкретные реализации могут предоставить ее.

Например, в CCL (см. Также ccl:*record-source-file*):

Welcome to Clozure Common Lisp Version 1.8-dev-r14962-trunk  (WindowsX8632)!
? (load "~/foo/foo.lisp")
#P"C:/Users/dhl/foo/foo.lisp"
? (ccl:find-definition-sources '*foo*)
(((#<VARIABLE-DEFINITION-TYPE VARIABLE #xC157526> . *FOO*) #<SOURCE-NOTE "home:f
oo;foo.lisp":0-22 "(defparameter *foo* 1)">))
? (ccl:source-note-filename (cadar (ccl:find-definition-sources '*foo*)))
"home:foo;foo.lisp.newest"
? (ccl:source-note-filename (ccl:function-source-note #'foo))
"home:foo;foo.lisp.newest"

(При этом используются логические пути .)

Итак, вам придется прочитать документацию вашей реализации или проверить, есть ли что-то вроде тривиального-find-source библиотека.

...