Last active
August 29, 2015 14:12
-
-
Save shirok/5987b9f76c9ccf6d6686 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(define x 0) ; x_0 | |
(let ((x 1)) ; x_1 | |
(let-syntax ((foo (syntax-rules () | |
((_) x)))) | |
(let ((x 2)) ; x_2 | |
(foo)))) ; => 1 | |
;; fooの展開で現れるxは、fooの使用位置から見えるx_2ではなく、 | |
;; fooの定義位置から見えるx_1。 | |
;; | |
;; Clojure方式ではトップレベル束縛に別名をつける。例えば | |
;; 今userモジュールにいるとして、user/x とすればローカル束縛を | |
;; すっ飛ばしてトップレベルのx_0を参照する、というふうにすれば、 | |
;; トップレベル変数をローカル変数がシャドウするケースを避けられるが、 | |
;; x_1のようにローカルな束縛に一意の名前をつけるうまい方法がない。 | |
;; さらに、x_1はlet-syntaxの「外側」にあるため、let-syntaxの展開だけで | |
;; x_1をユニークな名前にリネームすることができない。 | |
;; (x_1をxのままにしておき、let-syntax内で束縛されるxを全てリネームする、 | |
;; という展開は可能) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment