es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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)

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma de ver la versión expandida de (macro-expansion-seconds) sin evaluarla. Puedes usar el procedimiento expand para expandir la macro sin evaluarla. Aquí tienes un ejemplo:

    #lang racket
    
    (begin-for-syntax
      (define the-time (current-seconds)))
    
    (define-syntax (macro-expansion-seconds stx)
      (datum->syntax stx the-time))
    
    (define my-macro (macro-expansion-seconds))
    
    (define expanded (expand my-macro))
    
    (displayln expanded)
    

    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 variable my-macro que contiene una invocación de la macro. Finalmente, usamos el procedimiento expand para expandir my-macro y luego imprimimos el código expandido. Ten en cuenta que usamos datum->syntax en lugar de datum->syntax para convertir el valor the-time en sintaxis.

Comments are closed.