На лиспе есть вот такой код
(defmacro template (vars args &body body)
(let ((%do (gensym "DO"))
(%vars (gensym "VARS")))
(cond
((null vars)
`(macrolet ((,%do () ,@body))
(,%do)))
((consp vars)
`(template ,%vars ,args
(destructuring-bind ,vars ,%vars
,@body)))
(t `(macrolet ((,%do ()
`(progn
,@(mapcar (lambda (,vars) ,@body)
',args))))
(,%do))))))
Используется, например, так:
(template
((type word) (list :in) (string :across) (vector :across))
`(defmethod process ((l ,type))
(loop :for i ,word l :collect (process-element i)))
Суть макроса template в том, что создаётся анонимный макрос по переданному коду и тут же выполняется. Можно ли такое сделать в Scheme или Racket?