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

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

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

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

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

Posted feedbacks - Common Lisp

ネストできない><
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
(defmacro let-inspect (spec &body body)
  (let* ((vars (mapcar (lambda (x) (if (consp x) (car x) x)) spec))
         (expr (loop for v in vars collect `(list ',v (eval ,v)))))

  `(let ,spec
     (symbol-macrolet ((inspect (list ,@expr)))
     ,@body))))

(defparameter *gvar* 1)
(defun foo ()
  (let-inspect ((x 1)
                (y "hello")
                z)
    inspect))

(foo)                                   ; => ((X 1) (Y "hello") (Z NIL))

(list 'x (eval x)) だと x が二回評価されちゃいます。 ネストも扱うならこんな感じでしょうか。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
(defpackage :doukaku-lisp (:use :cl) (:shadow #:let))
(in-package :doukaku-lisp)

(define-symbol-macro local-variables nil)
(defmacro let (binding &body body)
  `(cl:let ,binding
     (cl:let ((local-variables (append
                                (list ,@(mapcar (lambda (e)
                                                  (if (consp e)
                                                     `(cons ',(car e) ,(car e))
                                                     `(cons ',e nil)))
                                                 binding))
                                 local-variables)))
       ,@body)))

(defun test ()
  (let ((x 1)
        (y "hello"))
    local-variables))

Index

Feed

Other

Link

Pathtraq

loading...