这可能是我在其他包中的词法绑定特殊 var 吗?

Is that possible I lexical binding special var in other package?

我有一个非常奇怪的要求,即词法绑定另一个包的特殊变量。

在文件中 A.lisp

(defpackage A
  (:use #:CL)
  (:export #:a-test))
(in-package A)
(declaim (special *a-sp-v*))
(defun a-test (&key (v *a-sp-v*))
  (print v))

在文件中 B.lisp

(defpackage B
  (:use #:CL #:A))
(in-package B)

(defun b-test ()
  (let ((*a-sp-v* 1))  ; cannot let a-test know
    (a-test)))

我一直在我的 REPL 中收到错误 The variable A::*A-SP-V* is unbound.

B中有一些方法可以绑定*a-sp-v*吗?让a-test函数运行特别*a-sp-v*不管在什么包里?

您的代码很好(不过我会使用 defvar 而不是 declaim special)。 您可以 绑定任何符号,它 它所在的包无关。

您只需要确保绑定您需要绑定的符号,而不是其他东西。 例如,由于您 不是 a 导出 a::*a-sp-v*,因此您的 b-test 绑定 b::*a-sp-v* 而不是 a::*a-sp-v*。 如果在 b-test 中将 *a-sp-v* 替换为 a::*a-sp-v*,它应该可以工作。 或者,您可以将 #:*a-sp-v* 添加到 (defpackage A ...)

中的 :export 部分