【发布时间】:2019-10-30 05:50:52
【问题描述】:
我正在探索 Common Lisp 语法的一些可能性,我想在 make-instance 上创建一个 :around 方法以在某些情况下返回一些任意值。为简单起见,当我没有传递所需的参数时,让它成为nil。它有效,但在调用 let 时无效:
(defclass foo ()
((bar :initarg := :initform '())))
(defmethod make-instance :around ((type (eql 'foo)) &key =)
(if (not =) nil (call-next-method)))
(print (make-instance 'foo)) ;; => NIL
(print (let ((x (make-instance 'foo))) x)) ;; => #<FOO {10037EEDF3}>
有人能解释一下这种情况吗?为什么呢? SBCL 是试图变得聪明,还是实际上是标准的事情?我知道我可以使用 apply 来解决它:
(print (let ((x (apply #'make-instance (list 'foo)))) x)) ;; => NIL
但我不想依赖这种解决方法。实际上我可以为此使用常规函数,这没关系,但我想了解它为什么会这样工作以及是否可以禁用这种行为。
【问题讨论】:
标签: common-lisp sbcl let clos