Supongamos que deseo desencadenar una macro de esquema en algo que no sea el primer elemento de una expresión s. Por ejemplo, supongamos que yo quería para reemplazar define
con un estilo infija :=
, de modo que:Macro de esquema activada por palabra clave que no es el encabezado de una lista
(a := 5) -> (define a 5)
((square x) := (* x x)) -> (define (square x) (* x x))
La transformación real parece ser bastante sencillo. El truco será lograr que Scheme encuentre las expresiones :=
y expandirlas macro. He pensado en rodear grandes secciones de código que usan la sintaxis de infijo con una macro estándar, tal vez: (with-infix-define expr1 expr2 ...)
, y hacer que la macro estándar recorra las expresiones en su cuerpo y realice las transformaciones necesarias. Sé que si tomo este enfoque, tendré que tener cuidado de evitar la transformación de listas que, en realidad, se supone que son datos, como las listas citadas y ciertas secciones de listas cuasicadas. Un ejemplo de lo que preveo:
(with-infix-define
((make-adder n) := (lambda (m) (+ n m)))
((foo) :=
(add-3 := (make-adder 3))
(add-6 := (make-adder 6))
(let ((a 5) (b 6))
(+ (add-3 a) (add-6 b))))
(display (foo))
(display '(This := should not be transformed))
Por lo tanto, mi pregunta es doble:
- Si tomo la ruta
with-infix-define
, tengo que mirar hacia fuera para cualquier escollos distintos de cotización y cuasiquote? - Me siento como si estuviera reinventando la rueda. Este tipo de acceso de código parece exactamente qué tendrían que hacer los sistemas de macro expansión estándar, la única diferencia es que solo miran el primer elemento de una lista cuando deciden si hacer o no una transformación de código. ¿Hay alguna manera de que pueda aprovechar los sistemas existentes?
¿Hay un paquete de código de walker para Scheme? Parece que todo lo que necesita hacer es ajustar el código en un macro, recorrer ese código y cambiar: = con el s-exp anterior, luego definir una macro de símbolo que haga: = equivalente para definir. No estoy seguro en las s-exps citadas sin embargo. –