通过以下 Common Lisp 最小示例代码(来自更复杂的代码库),我收到有关行的警告,((fboundp (car ',arg)) ,arg)
但我无法解释为什么或如何避免它们。
(defmacro cond-issue (&key (arg '(a b c)))
(let ((arg-var (gensym "arg-var-")))
`(let ((,arg-var (cond ((not (listp ',arg)) (list 'arg))
((fboundp (car ',arg)) ,arg)
(t ',arg))))
`(apply #'+ ,,arg-var))))
(cond-issue :arg (e f g))
CCL 抱怨:
;Compiler warnings :
; In an anonymous lambda form: Undefined function E
; In an anonymous lambda form: Undeclared free variable F
; In an anonymous lambda form: Undeclared free variable G
SBCL 抱怨:
; in: cond-issue :arg
; (E F G)
;
; caught style-warning:
; undefined function: common-lisp-user::e
;
; caught warning:
; undefined variable: common-lisp-user::f
;
; caught warning:
; undefined variable: common-lisp-user::g
;
; compilation unit finished
; Undefined function:
; e
; Undefined variables:
; f g
; caught 2 WARNING conditions
; caught 1 STYLE-WARNING condition
CLISP 并不抱怨。
使用 SBCL,我尝试了两种方法:编译和评估代码,警告方面没有区别。 [编辑:我从答案中得知我做错了]
这将是第二种cond
形式的一个(愚蠢的)示例用例。
(cond-issue :arg (car '(e f g)))
;; ⇒ (apply #'+ e)
CCL 和 SBCL 为何抱怨?
我该如何编写代码来满足CCL和SBCL?