Comment detail

ローカル変数の一覧を取得 (Nested Flatten)
これはキツイ…
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"))

Index

Feed

Other

Link

Pathtraq

loading...