Как было предложено в вопросе, связанном с макросами, который я недавно отправил в SO , я закодировал макрос, называемый «быстрый», посредством вызова функции (вот отдельный код в pastebin) * * 1005
(defun main ()
(progn
(format t "~A~%" (+ 1 2 (* 3 4) (+ 5 (- 8 6))))
(format t "~A~%" (fast (+ 1 2 (* 3 4) (+ 5 (- 8 6)))))))
Это работает в REPL под SBCL и CMUCL:
$ sbcl
This is SBCL 1.0.52, an implementation of ANSI Common Lisp.
...
* (load "bug.cl")
22
22
$
К сожалению, однако, код больше не компилируется:
$ sbcl
This is SBCL 1.0.52, an implementation of ANSI Common Lisp.
...
* (compile-file "bug.cl")
...
; during macroexpansion of (FAST (+ 1 2 ...)). Use *BREAK-ON-SIGNALS* to
; intercept:
;
; The function COMMON-LISP-USER::CLONE is undefined.
Так что, похоже, что мои макро-функции «быстрого» вызова («клон», «операция-p») во время компиляции я вызываю проблемы в компиляторах Lisp (проверено как в CMUCL, так и в SBCL).
Есть идеи о том, что я делаю неправильно и / или как это исправить?