challenge ローカル変数の一覧を取得

リフレクション系のお題の続編です。 ローカル変数の内容を取得して連想配列(ハッシュ、辞書など)に詰める コードを書いてください。

Pythonで表現すると、下のコードの???部分を埋めることになります。

>>> def foo():
	x = 1
	y = "hello"
	???
	return result

>>> foo()
{'y': 'hello', 'x': 1}

Posted feedbacks - Scheme

これはキツイ…
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...