微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

编译 Lambda 表达式时 SBCL 中的细微编译器警告

如何解决编译 Lambda 表达式时 SBCL 中的细微编译器警告

我需要一些帮助来理解编译 lambda 表达式时出现的 SBCL 编译器警告消息。 lambda 表达式临时存储为用户定义名称的符号值,编译后的函数随后存储在名称的符号函数下。

* (compile nil (symbol-value 'activate-connector-if!))
; in: LAMBDA (STATE ?CONNECTOR)
;     (APPLY #'SOME
;            (LAMBDA (WOULDWORK-PKG::?T1 WOULDWORK-PKG::?T2)
;              (AND
;               (GETHASH (+ 126 # #)
;                        (WOULDWORK-PKG::PROBLEM-STATE.IDB WOULDWORK-PKG::STATE))
;               (GETHASH (+ 126 # #)
;                        (WOULDWORK-PKG::PROBLEM-STATE.IDB WOULDWORK-PKG::STATE))
;               (LET (#)
;                 (WHEN VALUES #))
;               (LET (#)
;                 (WHEN VALUES #))
;               (NOT (EQL WOULDWORK-PKG::$HUE1 WOULDWORK-PKG::$HUE2))))
;            NIL NIL)
; --> MULTIPLE-VALUE-CALL SB-C::%FUNCALL SOME LET BLOCK SB-INT:DX-FLET FLET
; --> #:WRAPPER102 BLOCK LET
; ==>
;   (SB-C::%FUNCALL #:G100 #:G99)
;
; caught WARNING:
;   function called with one argument,but wants exactly two
;   See also:
;     The ANSI Standard,Section 3.2.2.3
;
; compilation unit finished
;   caught 1 WARNING condition
#<FUNCTION (LAMBDA (STATE ?CONNECTOR)) {1002E32AAB}>
T
T

警告对应于两个必需的参数,但没有关于从何处调用函数的信息。然而,只有一个可能的地方可以调用它,并且检查验证它是用两个参数调用的。

由于尽管有这个警告,程序在所有测试用例上都运行良好,起初我认为这意味着该函数永远不会被调用。但是一个跟踪验证它被正确调用了多次并且参数正确。

是否有其他方法可以了解生成警告的原因?

解决方法

(LAMBDA (WOULDWORK-PKG::?T1 WOULDWORK-PKG::?T2) ...) 需要 2 个参数,但 SOME 仅使用 1 个参数调用它。当您将 APPLY 调用转换为普通函数调用时,它看起来像:

(some (lambda (?t1 ?t2) ...) '())

需要与谓词函数的参数一样多的序列参数,但只有一个序列和两个参数。

也许您打算使用 FUNCALL 而不是 APPLYAPPLY 将其最后一个参数视为参数列表,因此 NIL 被扩展为无参数。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。