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

时间:2017-05-15 21:43:27

标签: common-lisp packages

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

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

(in-package :utils)

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

我想导出所有这50个定义。但没有其他符号。 把它们写进去:defpackage里面的export子句看起来很乏味。

我尝试使用循环工具来获取必要的符号,以便在包中列出符号。但是“符号”和“当前符号”都不输出所需的定义符号。我可以以某种方式减去“外部符号”和继承符号。但这似乎是每个人都需要的东西,应该有一个既定的简单解决方案。我环顾四周,没有找到一个简单的答案。

如何导出所有定义符号而无需单独手动编写?

2 个答案:

答案 0 :(得分:3)

扫描符号

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

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

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

更具选择性

您可以重新定义defundefmacro,以便他们自动导出其定义。 请参阅exporting.lisp中的CLISP。例如,

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

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

答案 1 :(得分:1)

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

我可能会使用ad hoc键盘宏。您还可以编写一个小的Lisp函数来按表单读取文件格式,并输出相关的符号进行复制粘贴。