2011-07-23 14 views
7

Serbest tanımlayıcıyı anlamaya çalışıyorum =? ve sınır tanımlayıcı =? Özgür tanımlayıcıyı kullanarak bana eşdeğer kod örnekleri verebilir mi? true ve bound-identifier = kullanıldı yanlış dönecekti.arasındaki fark =? ve sınır tanımlayıcı =?

Teşekkür

+1

[Nasıl serbest tanımlayıcı =? ve sınır tanımlayıcı =? çalışır?] (http://groups.google.com/group/plt-scheme/browse_thread/thread/1f95b5c0f8540f93) –

+0

[Bu e-postaya bakın] (http://lists.racket-lang.org/users/archive/2011 -Newil/045117.html) Racket posta listesine ve çevreleyen konuya. –

+0

Bu işlevlerin ne için kullanılması gerektiğini anlıyorum ve neden oldukları yollarını (işaretler ve yer değiştirmeler açısından) anladıklarını anlıyorum. Anlamakta zorlandıklarım, farklı sonuçlar verebilecekleri durumlardır. Bir kod örneği (oldukça anlamsız olsa bile) bununla yardımcı olacaktır. – jahhaj

cevap

5

İşte bir örnek:

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

x üzerine biraz o genişletme adımı bir işareti, ama bu yüzden bound-identifier=? onları farklı düşünmektedir vermez compare-with-x yılında xgo tarafından sahiptir tanıtıldı. bir argüman bir iz yok gibi xgo2 verilen oysa

(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) 
İşte

go2 ayrıca işaretiyle bir x tanıtır:

İşte başka bir örnek. Aynı hikaye.

+0

Basit gerçekten, teşekkürler – jahhaj

+0

'(ile karşılaştırmak x x)' de sonuç var ''(#t #f). İlk örnek için 'go' makrosu gerekli değildir. – soegaard