Esta es una pregunta más teórica sobre las macros (creo). Sé que las macros toman el código fuente y producen código objeto sin evaluarlo, lo que permite a los programadores crear estructuras sintácticas más versátiles. Si tuviera que clasificar estos dos macro sistemas, diría que era la macro "Estilo C" y la macro "Estilo Lisp".¿Cómo hace un lenguaje macro habilitado para hacer un seguimiento del código fuente para la depuración?
Parece que las macros de depuración pueden ser un poco complicadas porque, en tiempo de ejecución, el código que realmente se ejecuta difiere de la fuente.
¿Cómo hace el depurador un seguimiento de la ejecución del programa en términos del código fuente preprocesado? ¿Existe un "modo de depuración" especial que deba configurarse para capturar datos adicionales sobre la macro?
En C, puedo entender que establezca un modificador de tiempo de compilación para la depuración, pero ¿cómo lo haría un lenguaje interpretado, como algunas formas de Lisp?
Disculpame por no haber probado esto, pero la herramienta de lisp requiere más tiempo de lo que tengo que gastar para averiguarlo.
Pero mapear código compilado de nuevo a macro no resuelve el siguiente problema: cuando macro genera código basado en entrada declarativa (por ejemplo, macro que genera analizador de gramática sin contexto) sería muy útil durante la depuración para poder encontrar qué parte de la entrada está siendo "activa" (por ejemplo, qué regla de gramática se está emparejando si eso es posible). Eso requeriría que el macro escritor dijera explícitamente qué partes del mapa de código generado corresponden a qué partes de la entrada de macro. ¿Las macros Raqueta tienen esa habilidad? De lo contrario, es equivalente al código de depuración (parcialmente) expandido. –
"De lo contrario, es equivalente al código de depuración (parcialmente) expandido". No creo que esté equivocado en esta oración. Por favor ignórelo. –
dmity-vk: Derecha - la forma especial 'sintaxis' en Racket consiste básicamente en combinar fragmentos de código del usuario macro con fragmentos de código de la macro misma, y asegurarse de que la ubicación de origen en los formularios resultantes correcto en todas las formas. –