假设我在名为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命令或类似命令。为了在生成的文件中生成一些文档,程序的位需要知道其他位来自何处,这似乎是我应该能够做的事情,而无需手动传入原始文件。
答案 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。)
因此,您必须阅读实现文档,或检查是否有类似于简单查找源库的内容。