2010-11-08 25 views
2

On dit que les macros de schémas, au moins la syntaxe-casse, permettent un calcul arbitraire sur le code à transformer. Cependant (à la fois dans le cas général et dans le cas spécifique que je suis en train de regarder) cela nécessite que le calcul soit spécifié en termes de fonctions récursives. Quand j'essaie différentes variantes de ceci, je reçois par exempleCalcul arbitraire dans la macro Scheme

main.scm: 32: 71: compiler: identificateur non lié dans le module (dans l'environnement du transformateur, qui ne comprend pas à la définition d'exécution) dans: expand-vars

(La mise en oeuvre est Raquette, si ça compte.)

Le résultat semble être que vous ne pouvez pas définir les fonctions nommées avant le traitement de la macro. Je suppose que je pourrais avoir recours au combinateur Y, mais je me dis que cela vaut la peine de demander d'abord s'il existe une meilleure approche?

Répondre

5

Oui, le fait que vous utilisiez Racket importe - dans Racket, il y a quelque chose qui s'appelle «séparation de phase», ce qui signifie que le niveau de syntaxe ne peut pas utiliser les fonctions d'exécution. Par exemple, ceci:

#lang racket 
(define (bleh) #'123) 
(define-syntax (foo stx) 
    (bleh)) 
(foo) 

ne fonctionnera pas car bleh est lié à une exécution, non disponible pour la syntaxe. Au lieu de cela, il devrait être

(define-for-syntax (bleh) #'123) 

ou

(begin-for-syntax (define (bleh) #'123)) 

ou déplacé comme une définition interne au corps de la macro, ou déplacé vers son propre module et requis à l'aide (require (for-syntax "bleh.rkt")).