試圖理解free-identifier =?和bound-identifier = ?.任何人都可以給我等效的代碼示例,其中使用free-identifier =?會返回true並使用bound-identifier =?會返回false。free-identifier =?之間的區別和bound-identifier =?
感謝
試圖理解free-identifier =?和bound-identifier = ?.任何人都可以給我等效的代碼示例,其中使用free-identifier =?會返回true並使用bound-identifier =?會返回false。free-identifier =?之間的區別和bound-identifier =?
感謝
下面是一個例子:
(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-x
的x
沒有,所以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
,而給予go2
的x
作爲參數沒有一個標誌。相同的故事。
相關[free-identifier =?和bound-identifier =?作品?](http://groups.google.com/group/plt-scheme/browse_thread/thread/1f95b5c0f8540f93) –
請參閱[此電子郵件](http://lists.racket-lang.org/users/archive/2011 - 四月/ 045117.html)在球拍郵件列表和周圍的線程。 –
我明白這些功能應該用於什麼,並且我明白他們爲什麼定義它們的方式(以標記和替換方式)。我難以理解的是他們可以給出不同結果的情況。一個代碼示例(即使相當毫無意義)會對此有所幫助。 – jahhaj