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-packagefind-symbol 来检查包是否存在,如果存在则从包中获取符号。然后,您可以使用 symbol-functionsymbol-value 来获取与符号关联的函数或值。在我的示例中,funcall 自动查找与 find-symbol 返回的符号关联的函数,因此 symbol-function 不是必需的。