2011-07-23 5 views
7

Essayer de comprendre free-identifier =? et bound-identifier = ?. Quelqu'un peut-il me donner des exemples de code équivalent en utilisant free-identifier =? retournerait true et utiliser bound-identifier =? retournerait faux.différence entre free-identifier =? et bound-identifier =?

Merci

+1

related [Comment fonctionne free-identifier =? et bound-identifier =? fonctionne?] (http://groups.google.com/group/plt-scheme/browse_thread/thread/1f95b5c0f8540f93) –

+0

Voir [cet email] (http://lists.racket-lang.org/users/archive/2011 -April/045117.html) sur la liste de diffusion Racket, et le thread environnant. –

+0

Je comprends à quoi ces fonctions devraient servir, et je comprends pourquoi elles sont définies telles qu'elles sont (en termes de marques et de substitutions). Ce que j'ai de la difficulté à saisir, ce sont les circonstances dans lesquelles ils peuvent donner des résultats différents. Un exemple de code (même si cela ne veut rien dire) aiderait à cela. – jahhaj

Répondre

5

Voici un exemple:

(define-syntax (compare-with-x stx) 
    (syntax-case stx() 
    [(_ x-in) 
    (with-syntax ([free=? (free-identifier=? #'x-in #'x)] 
        [bound=? (bound-identifier=? #'x-in #'x)]) 
     #'(list free=? bound=?))])) 

(define-syntax go 
    (syntax-rules() 
    [(go) (compare-with-x x)])) 

(go) ;; => '(#t #f) 

Le x introduit par go a une marque de cette étape d'expansion sur elle, mais le x dans compare-with-x ne pas, donc bound-identifier=? les considère comme différentes.

Voici un autre exemple:

(define-syntax (compare-xs stx) 
    (syntax-case stx() 
    [(_ x1 x2) 
    (with-syntax ([free=? (free-identifier=? #'x2 #'x2)] 
        [bound=? (bound-identifier=? #'x1 #'x2)]) 
     #'(list free=? bound=?))])) 

(define-syntax go2 
    (syntax-rules() 
    [(go2 x-in) (compare-xs x-in x)])) 

(go2 x) ;; => '(#t #f) 

Ici go2 introduit également un x avec une marque, alors que la x donnée à go2 comme argument n'a pas une marque. Même histoire.

+0

Simple vraiment, merci – jahhaj

+0

Notez que '(compare-with-x x)' a aussi le résultat ''(#t #f) '. La macro 'go' n'est donc pas nécessaire pour le premier exemple. – soegaard