通用Lisp从包中导出符号

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通用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))

我的问题是:有时仅使用一些全局变量和函数来设计接口可能不够用,而您必须导出一些结构。在这种情况下,如果您不只是导出该结构的访问器函数,就不能操作这些结构的对象。因此,有没有一种简便的方法可以实现这种效果而无需手动导出所有这些访问器函数?

答案

[一旦创建了包并创建了其中的所有符号,例如,通过加载实现该包的代码,您就可以export您想要的任何符号,例如,导出所有符号:

另一答案

评估宏扩展代码,如果没有提供类选项,并且在导出函数的符号中必须加上其他错误,则在defclass形式的最后一个nil处出现错误。这是一个正确的版本,似乎可以在我的通用Lisp系统(sbcl)上使用:

另一答案

Vsevolod的帖子也启发了我发布一个宏:

另一答案

cl-annot包有一种方法。其export-slotsexport-accessorsexport-constructors允许自动导出它们。它适用于类和结构。

以上是关于通用Lisp从包中导出符号的主要内容,如果未能解决你的问题,请参考以下文章

避免从 Linux 上的可执行文件中导出符号

Lisp 导出内部符号

内核符号导出

如何对从包中导入的方法进行存根和间谍活动?

如何配置 Python 以便我可以直接从包中导入函数?

php中导出excel时 数字显示问题