有没有办法找出一个表格来自哪个文件?

时间:2012-02-16 23:43:02

标签: lisp common-lisp

假设我在名为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 个答案:

答案 0 :(得分:4)

对于与实现无关的方法,请查看swank::find-source-location

答案 1 :(得分:2)

据我所知,此功能不是标准的一部分,但具体实现可能会提供它。

例如,在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"

(这使用logical pathnames。)

因此,您必须阅读实现文档,或检查是否有类似于简单查找源库的内容。