2011-07-23 36 views
7

試圖理解free-identifier =?和bound-identifier = ?.任何人都可以給我等效的代碼示例,其中使用free-identifier =?會返回true並使用bound-identifier =?會返回false。free-identifier =?之間的區別和bound-identifier =?

感謝

+1

相關[free-identifier =?和bound-identifier =?作品?](http://groups.google.com/group/plt-scheme/browse_thread/thread/1f95b5c0f8540f93) –

+0

請參閱[此電子郵件](http://lists.racket-lang.org/users/archive/2011 - 四月/ 045117.html)在球拍郵件列表和周圍的線程。 –

+0

我明白這些功能應該用於什麼,並且我明白他們爲什麼定義它們的方式(以標記和替換方式)。我難以理解的是他們可以給出不同結果的情況。一個代碼示例(即使相當毫無意義)會對此有所幫助。 – jahhaj

回答

5

下面是一個例子:

(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通過go出臺了從它那膨脹工序的標誌,但在compare-with-xx沒有,所以bound-identifier=?認爲它們不同。

再舉一例:

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

這裏go2還引入了帶有標記的x,而給予go2x作爲參數沒有一個標誌。相同的故事。

+0

真的很簡單,謝謝 – jahhaj

+0

請注意'(compare-with-x x)'也有結果''( #t #f)'。第一個例子不需要'go'宏。 – soegaard