Common Lisp 包 - 当包可能无法加载时如何处理?
Common Lisp Packages - How to deal when a package might not be loaded?
假设一个普通的 lisp 库用户也可以加载包 A、包 B 或两者都不加载。我希望能够接受来自任一包的对象。理想情况下,这只是在这些对象上定义方法的情况。但是,如果包未在编译时加载,尝试这样做将生成包 XYZ 不存在错误。我不想强迫用户加载这两个包,所以关于我如何在运行时进行条件调用有什么建议吗?
您可以执行类似以下操作:
(defun foo (x)
(cond
((find-package :bar) (funcall (find-symbol "x" :bar) x))
((find-package :baz) (funcall (find-symbol "y" :baz) x))))
基本上,使用find-package
和find-symbol
来检查包是否存在,如果存在则从包中获取符号。然后,您可以使用 symbol-function
和 symbol-value
来获取与符号关联的函数或值。在我的示例中,funcall
自动查找与 find-symbol
返回的符号关联的函数,因此 symbol-function
不是必需的。
假设一个普通的 lisp 库用户也可以加载包 A、包 B 或两者都不加载。我希望能够接受来自任一包的对象。理想情况下,这只是在这些对象上定义方法的情况。但是,如果包未在编译时加载,尝试这样做将生成包 XYZ 不存在错误。我不想强迫用户加载这两个包,所以关于我如何在运行时进行条件调用有什么建议吗?
您可以执行类似以下操作:
(defun foo (x)
(cond
((find-package :bar) (funcall (find-symbol "x" :bar) x))
((find-package :baz) (funcall (find-symbol "y" :baz) x))))
基本上,使用find-package
和find-symbol
来检查包是否存在,如果存在则从包中获取符号。然后,您可以使用 symbol-function
和 symbol-value
来获取与符号关联的函数或值。在我的示例中,funcall
自动查找与 find-symbol
返回的符号关联的函数,因此 symbol-function
不是必需的。