shiro #1601(2007/07/30 18:55 GMT) [ Scheme ] Rating3/3=1.00
これはキツイ… Gaucheでは最適化によって、定数で初期化されて一度も 変更されないローカル変数とかは実行時には消えてしまいますし、 逆にマクロ展開によってプログラム上には無いローカル変数が 挿入される場合もあります。 やるとしたらマクロで処理系そのものを置き換えるしか なさそうです。ここではletだけ再定義していますが、 ちゃんと動かすにはdefine, lambda, let*, letrec, あたりの束縛系を全部再定義しないと…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
(use util.match) (define-macro (let binds . body) (match binds [((var init) ...) `((lambda (local-vars) (apply (lambda ,var ,@body) (map cdr local-vars))) (list ,@(map (lambda (v i) `(cons ',v ,i)) var init)))])) ;;; (define (foo) (let ((x 1) (y "hello")) local-vars)) ;; => ((x . 1) (y . "hello"))
Rating3/3=1.00-0+
[ reply ]
shiro
#1601()
[
Scheme
]
Rating3/3=1.00
Rating3/3=1.00-0+
[ reply ]