Seguindo o código de exemplo mínimo do Common Lisp (de uma base de código muito mais complexa), recebo avisos sobre line ((fboundp (car ',arg)) ,arg)
e não consigo explicar por que ou como evitá-los.
(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 reclama:
;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 reclama:
; 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 não reclama.
Com o SBCL tentei as duas coisas: compilar e avaliar o código, sem diferença quanto aos avisos. [editar: aprendi com as respostas que fiz isso errado]
Este seria um exemplo de caso de uso (bobo) para o segundo cond
formulário.
(cond-issue :arg (car '(e f g)))
;; ⇒ (apply #'+ e)
Qual a explicação, por que a CCL e a SBCL estão reclamando?
E como posso escrever o código para satisfazer CCL e SBCL?