Common Lisp从包中导出符号

oak*_*ld1 12 export common-lisp

是否有一种从包中导出所有符号的简短方法,或者它是唯一的方法defpackage.我通常将我的代码编写在一个文件中foo.lisp,该文件通常以一个文件开头,(in-package :foo)并将包定义放到一个文件中package.lisp,该文件通常包含以下内容

(in-package :cl-user)

(defpackage :foo
  (:use :cl)
  (:documentation "Bla bla bla."
  (:export :*global-var-1*
           :*global-var-2*
           :function-1
           :function-2
           :struct
           :struct-accessor-fun-1
           :struct-accessor-fun-2
           :struct-accessor-fun-3
           :struct-accessor-fun-4))
Run Code Online (Sandbox Code Playgroud)

我的问题是:使用一些全局变量和函数简单地设计一个接口有时可能不够用,你必须导出一些结构.在这种情况下,如果您不是简单地导出此结构的访问器函数,则无法操纵这些结构的对象.那么,有没有一种简单的方法来实现这种效果而无需手动导出所有这些访问器功能?

Dou*_*rie 12

一旦创建了包,并且创建了包中的所有符号,例如,通过加载实现包的代码,您可以导出您喜欢的任何符号,例如,导出所有符号:

(do-all-symbols (sym (find-package :foo)) (export sym))
Run Code Online (Sandbox Code Playgroud)

你可能会更开心

(let ((pack (find-package :foo)))
  (do-all-symbols (sym pack) (when (eql (symbol-package sym) pack) (export sym))))
Run Code Online (Sandbox Code Playgroud)

它不会尝试从已使用的包中重新导出所有内容.