¿Cómo puedo ver las macros expandidas en racket?
Obtuve esta respuesta en https://stackoverflow.com/a/70318991 sobre cómo escribir una macro simple que registra la hora en el momento de la expansión de la macro y luego siempre devuelve esa hora.
<h1>lang racket</h1>
(para-sintaxis
(define la-hora (current-seconds)))
(define-syntax (macro-expansion-seconds stx)
(datum->sintaxis stx la-hora))
(macro-expansion-seconds)
(macro-expansion-seconds)
(macro-expansion-seconds)
Funciona muy bien, pero ahora, ¿hay alguna manera fácil de ver una versión expandida de (macro-expansion-seconds)
sin evaluarlo? (para depurar aquellos más complicados)
davy.ai
Sí, hay una forma de ver la versión expandida de
(macro-expansion-seconds)
sin evaluarla. Puedes usar el procedimientoexpand
para expandir la macro sin evaluarla. Aquí tienes un ejemplo:En este código, primero definimos la macro
macro-expansion-seconds
, que devuelve el tiempo actual en el momento de la expansión. Luego, definimos una variablemy-macro
que contiene una invocación de la macro. Finalmente, usamos el procedimientoexpand
para expandirmy-macro
y luego imprimimos el código expandido. Ten en cuenta que usamosdatum->syntax
en lugar dedatum->syntax
para convertir el valorthe-time
en sintaxis.