Common lisp 编译Lambda表达式时SBCL中出现细微的编译器警告

Common lisp 编译Lambda表达式时SBCL中出现细微的编译器警告,common-lisp,compiler-warnings,sbcl,Common Lisp,Compiler Warnings,Sbcl,我想了解SBCL编译器警告消息方面的一些帮助,该消息在编译lambda表达式时发生。lambda表达式临时存储为用户定义名称的符号值,编译后的函数随后存储在名称的符号函数下 * (compile nil (symbol-value 'activate-connector-if!)) ; in: LAMBDA (STATE ?CONNECTOR) ; (APPLY #'SOME ; (LAMBDA (WOULDWORK-PKG::?T1 WOULDWORK-PKG::

我想了解SBCL编译器警告消息方面的一些帮助,该消息在编译lambda表达式时发生。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个参数,但有些人仅用1个参数调用它。将APPLY调用转换为普通函数调用时,如下所示:

(some (lambda (?t1 ?t2) ...) '())
谓词函数的参数需要有尽可能多的序列参数,但只有一个序列和两个参数

也许你想用FUNCALL而不是APPLY?APPLY将其最后一个参数视为参数列表,因此NIL被扩展为无参数。

LAMBDA WOULDWORK-PKG::?T1 WOULDWORK-PKG::?T2。。。需要2个参数,但有些人仅用1个参数调用它。将APPLY调用转换为普通函数调用时,如下所示:

(some (lambda (?t1 ?t2) ...) '())
谓词函数的参数需要有尽可能多的序列参数,但只有一个序列和两个参数


也许你想用FUNCALL而不是APPLY?APPLY将其最后一个参数视为参数列表,因此NIL被扩展为无参数。

感谢提供有关如何更好地阅读调试器消息的线索。但是为什么应用“some lambda x y list x y nil nil”不会在REPL上产生警告呢?SBCL不是将其包装在lambda中然后编译吗?@davypough:它可能应该发出警告。Not warning并不意味着代码是正确的…@davypough我不确定SBCL的REPL是否通过首先编译表达式来工作。实际上,执行该表达式并不表示有错误,因为有些人似乎会检查列表是否为空,并且从不费心调用谓词。如果更改为应用“some lambda x y list x y”1 nil,则会出现运行时错误,而不是编译时错误。感谢您提供有关如何更好地读取调试器消息的线索。但是为什么应用“some lambda x y list x y nil nil”不会在REPL上产生警告呢?SBCL不是将其包装在lambda中然后编译吗?@davypough:它可能应该发出警告。Not warning并不意味着代码是正确的…@davypough我不确定SBCL的REPL是否通过首先编译表达式来工作。实际上,执行该表达式并不表示有错误,因为有些人似乎会检查列表是否为空,并且从不费心调用谓词。如果更改为应用“some lambda x y list x y”1 nil,则会出现运行时错误,而不是编译时错误。