如何导出 Common Lisp 文件中的所有定义符号?

How to export all definition symbols in a file in Common Lisp?

我的 lisp 文件包含大约 50 个函数和宏定义。文件的开头是:

(defpackage :utils
  (:use :common-lisp))

(in-package :utils)

; ...  ~50 defuns/defmacros follow along with some other code

我想导出所有这 50 个定义。但没有其他符号。 将它们全部写在 defpackage 中的 :export 子句中似乎非常乏味。

我尝试通过使用循环的工具在包中列出符号来获取必要的符号。但是 "symbol" 和 "present-symbol" 都没有输出所需的定义符号。我可以以某种方式减去 "external-symbols" 和继承的符号。但这似乎是每个人都需要的东西,应该有一个既定的简单解决方案。我环顾四周,没有找到直接的答案。

如何导出所有定义符号而不必手动单独写出它们?

扫描符号

您可以扫描所有符号并导出 所有具有函数绑定的(这包括宏名称):

(defun export-fbound-symbols (package)
  "export symbols with function bindings"
  (do-symbols (s package)
    (when (fboundp s)
      (export s package))))

这通常不是一个好主意:好的软件工程实践是限制 public 接口集。

更有选择性

您可以重新定义 defun and defmacro 以便他们自动导出他们的定义。 参见 exporting.lisp in CLISP。例如,

(defmacro define-function (name lambda-list &body body)
  `(progn
     (export ',name)
     (defun ,name ,lambda-list ,@body)))

请注意,这忽略了 (defun (setf foo) (...) ...) 的可能性。

不,这不是每个人都需要的。通常,您会在编写(并且实际需要)它们时导出它们。

我可能会为此使用临时键盘宏。您还可以编写一个小的 Lisp 函数来逐个读取文件并输出相关符号以进行复制粘贴。