gpt4 book ai didi

lisp - 如何获取在 Common Lisp 中定义函数的文件名?

转载 作者:行者123 更新时间:2023-12-04 22:34:17 25 4
gpt4 key购买 nike

我想获取上次写入特定函数或宏定义的文件的名称,用于各种文档和测试目的?

在 #CommonLisp (IRC.LIBERA.CHAT) 上 PJB 的帮助下,我发布了一个对我来说效果很好的答案,但我会接受任何提供不依赖于 SWANK 或提供额外细节的可移植解决方案的答案关于如何在其他 IDE(如 LispWorks、ACL 等)中实现相同的目的。

最佳答案

如果您寻求的是一个可移植解决方案——一个用可移植 CL 编写的解决方案——那么答案就是定义用于定义表单的包装器,然后使用这些包装器。

(defvar *flocs* (make-hash-table :test #'equal))

(defgeneric function-location (f/name)
(:method ((name t))
(values (gethash name *flocs* nil) t))
(:method ((f function))
(multiple-value-bind (le cp nm) (function-lambda-expression f)
(declare (ignore le cp))
(if nm
(function-location nm)
(values nil nil)))))

(defmacro define-function (f args &body doc/decls/forms)
(when (or *load-pathname* *compile-file-pathname*)
;; Prefer *load-pathname*
(setf (gethash f *flocs*) (or *load-pathname* *compile-file-pathname*)))
`(defun ,f ,args ,@doc/decls/forms))

在现实生活中你当然会调用 define-function defun ,类似地使用 define-variable 等,然后构造一个CL 的管道包,它导出所有 CL 符号,同时用这些符号替换定义形式。

如果您寻求的是一种可移植的解决方案,即它导出一些标准接口(interface)但具有不同的依赖于实现的后端,那么看看 SLY 或 SWANK 所做的可能是一个好的开始。对于 LW,您可能希望后端使用 DSPEC,这是它处理位置信息的方式:

> (dspec:dspec-definition-locations '(defun foo))
(((defun foo) :listener))

> (dspec:dspec-definition-locations '(defun needs))
(((defmacro needs)
#P"..."))

> (defclass foo () ())
#<standard-class foo 402000B763>

> (dspec:name-definition-locations dspec:*dspec-classes* 'foo)
(((defclass foo) :listener) ((defun foo) :listener))

关于lisp - 如何获取在 Common Lisp 中定义函数的文件名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69675964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com