ローカル変数の一覧を取得
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))
|




にしお
#3391()
Rating0/0=0.00
Pythonで表現すると、下のコードの???部分を埋めることになります。
>>> def foo(): x = 1 y = "hello" ??? return result >>> foo() {'y': 'hello', 'x': 1}[ reply ]