Skip to content

Instantly share code, notes, and snippets.

@shirok
Last active August 29, 2015 14:12
Show Gist options
  • Save shirok/5987b9f76c9ccf6d6686 to your computer and use it in GitHub Desktop.
Save shirok/5987b9f76c9ccf6d6686 to your computer and use it in GitHub Desktop.
(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