В emacs lisp (но ответы, относящиеся к общему lisp, также приветствуются), у меня есть библиотека, в которой используется макрос, и я хочу перехватить один из аргументов макроса только при выполнении в определенном контексте. По сути, я хочу макрос:
; My macro. This is a sketch of what I want that doesn't work.
(defmacro hijack-f (body)
`(macrolet ((f (x) `(f (+ 1 ,x))))
,@body))
; Defined in the library, I don't want to deal with these
(defmacro f (x) x)
(defun g (x) (f x))
Так что
(g 1) ; => 1
(hijack-f (g 1)) ; => 2
(hijack-f (hijack-f (g 1))) ; => 3
EDIT: @melpomene и @ reiner-joswig правильно указывают, что f
расширен в g
до hijack-f
. Как продолжение есть hijack-f
такой, что:
(f 1) ; => 1
(hijack-f (f 1)) ; => 2
(hijack-f (hijack-f (f 1))) ; => 3