f!
私は、ラムダに展開されるマクロ (Doug Hoyteo!
に基づく) を使用して、共通 Lisp 内のスキームの単一の名前空間をエミュレートしようとしていますg!
。同じ式ですが、funcall
各呼び出しの関数位置に追加されています。例えば:
(fplambda (f!z x) (f!z x x))
次のように展開されます。
(LAMBDA (F!Z X) (FUNCALL F!Z X X))
現在、マクロは次のようになっています。
(defmacro fplambda (parms &body body)
(let ((syms (remove-duplicates
(remove-if-not #'f!-symbol-p
(flatten body)))))
`(lambda ,parms
(macrolet ,(mapcar
(lambda (f)
`(,f (&rest parmlist) `(funcall ,',f ',@parmlist)))
syms))
,@body)))
しかし、上記の入力を考えると、(私が見る限り)これに展開されます:
(LAMBDA (F!F X)
(MACROLET ((F!F (&REST PARMLIST) `(FUNCALL ,'F!F ',@PARMLIST))))
(F!F X X))
マクロレットの定義では、F!F を引用符で囲んだり、引用符を外したりしてはならず、parmlist は引用符を外してください。何が起こっている?前もって感謝します!