1

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 は引用符を外してください。何が起こっている?前もって感謝します!

4

1 に答える 1