que a menudo se encuentran los siguientes tipos de definición incrementales útil:¿Es posible la definición incremental de Macro?
(define (foo) (display "bar"))
(foo)
;prints bar
(define foo (let ((bar foo))
(lambda()
(display "foo")
(bar))))
(foo)
;prints foobar
¿Cómo preforma de este tipo de definición incrementales con macros? No pude obtener la sintaxis let para proporcionar la misma funcionalidad.
Actualmente uso PLT Scheme, pero les gustaría ver respuestas en diferentes implementaciones de Lisp también.
Editar:
Ingenuamente me gustaría hacer lo siguiente:
(define-syntax foo
(syntax-rules()
((_) (display "bar"))))
(define-syntax foo
(let-syntax ((old-foo (syntax-rules() ((_) (foo)))))
(syntax-rules()
((_) (begin
(display "foo")
(old-foo))))))
Traducción de macros ingenuos al trabajo macros PLT Scheme:
(require-for-syntax scheme/base)
(define-syntax foo
(syntax-rules()
[(foo) (display "bar")]))
(define-syntax foo
(let ([old (syntax-local-value #'foo)])
(lambda (stx)
#`(begin #,((syntax-rules()
[(_) (begin (display "foo"))]) stx)
#,(old #'(_))))))
(foo)
Si me falta un mejor método Házmelo saber.
Gracias, tuve que incluir (requiere esquema/base de sintaxis) para hacer que la composición se defina en la fase de sintaxis (para hacer que la composición se defina dentro de la sintaxis de definición). ¿Puedes comentar sobre mi enfoque ingenuo (agregado a la pregunta) que no está implementado? ¿El tiempo no es práctico o cómo es inconsistente con la sintaxis existente? – Davorak
Sí, necesita 'scheme/base' para componer; pero puede combinar funciones de macro de la forma que desee, son solo funciones de sintaxis a sintaxis, y 'sintaxis-reglas' es una macro conveniente (segundo nivel, por lo general) que genera dichas funciones. En cuanto a su enfoque ingenuo, adolece de algunos problemas fundamentales: trata de capturar de alguna manera la sintaxis anterior, pero no puede obtener su * valor * de esta manera, por lo que el resultado es una macro que se expande a llamadas a sí mismo. Otro problema es tratar de usar 'display' para depurar cosas: las macros * no * lo harán, * se * expandirán * a él. –
Gracias, sabía que no podía capturar la sintaxis antigua de esta manera y que se expandiría en sí misma. Simplemente pensé que era muy parecida a una sintaxis con la que estaba familiarizado y me pregunté por qué, dado que existía en el nivel de funciones, por qué no existía a nivel macro, aunque no parecía haber nada fundamental que impidiera que un compilador actuara de esa manera. Estaba tratando de usar la pantalla como una prueba para ver si la macro se construyó correctamente, edité mi pregunta una traducción de mi macro ingenua a una macro de esquema plt en funcionamiento. – Davorak