macros - Cálculo arbitrario en Scheme macro
racket (1)
Sí, el hecho de que estés usando Racket importa: en Racket, hay algo que se llama "separación de fases", lo que significa que el nivel de sintaxis no puede usar funciones de tiempo de ejecución. Por ejemplo, esto:
#lang racket
(define (bleh) #''123)
(define-syntax (foo stx)
(bleh))
(foo)
no funcionará, ya que bleh
está vinculado a un tiempo de ejecución, no está disponible para la sintaxis. En cambio, debería ser
(define-for-syntax (bleh) #''123)
o
(begin-for-syntax (define (bleh) #''123))
o movido como una definición interna al macro cuerpo, o movido a su propio módulo y requerido usando (require (for-syntax "bleh.rkt"))
.
Se dice que las macros de esquema, al menos la variedad de caso de sintaxis, permiten la transformación del cálculo arbitrario en el código. Sin embargo (tanto en el caso general como en el caso específico que estoy viendo) esto requiere que el cálculo se especifique en términos de funciones recursivas. Cuando pruebo varias variantes de esto, obtengo, por ej.
main.scm: 32: 71: compilar: identificador desatado en el módulo (en el entorno del transformador, que no incluye la definición del tiempo de ejecución) en: expand-vars
(La implementación es Racket, si es importante).
El resultado parece ser que no puede definir funciones con nombre hasta después del procesamiento de macro.
Supongo que podría recurrir al combinador Y, pero creo que vale la pena preguntar primero si hay un mejor enfoque.