"What if the original definition said "mac (foo x)" but the extension said "mac (foo y)"? I recommend putting in a form that binds the right variables"
Whoops, that (with ...) stuff isn't ideal because it leaves the outer variables in scope. That is, if the original definition has a parameter called "list", an extension will see that binding even if it uses a different name for the same parameter, so it might try to call the global 'list and be surprised.
I suppose I recommend doing this instead, where g123-args is a gensym:
mac (foo . g123-args)
`(if ,(apply (fn (x)
`nil)
g123-args)
,(apply (fn (x)
(if (acons x)
`(list ,(car x))
`(err "I hope this code will never be reached.")))
g123-args)
,(apply (fn (x)
`(+ ,x 1))
g123-args))
Er, and there's one more change I should probably make here so you can actually use this for what you're trying to do.
let g1-old foo
(mac (foo . g2-args)
`(if ,(apply (fn (x)
`nil)
g2-args)
,(apply (fn (x)
(if (acons x)
`(list ,(car x))
`(err "I hope this code will never be reached.")))
g2-args)
(,g1-old ,@g2-args)
; or in Arc, ",(apply rep.g1-old g2-args)"
)