2011-05-29 6 views
6

en Lisp puedo obligar a variables libres unidas en un cierre como este ...¿En LISP cómo inspeccionar variables libres en un cierre?

(let ((x 1) (y 2) (z 3)) 
    (defun free-variables() (+ x y z))) 

(free-variables) 

resultados en ...

6 

Lo que yo quiero saber es si es posible inspeccionar cota variables de cierre dinámicamente?

E.g.

(inspect-closure free-variables) 

que resulta en algo como ...

((x 1) (y 2) (z 3)) 

Gracias SO

Respuesta

7

Common Lisp

El acceso a las variables internas del cierre sólo es posible a partir de funciones en el mismo ámbito (Véase la respuesta de Jeff). Incluso aquellos no pueden consultar en alguna parte estas variables. Esta funcionalidad no es proporcionada por el estándar Common Lisp.

Obviamente, en muchos casos las implementaciones individuales Common Lisp saben cómo conseguir esta información. Si nos fijamos, por ejemplo, en el código de BABA (un entorno de desarrollo Common Lisp) para GNU Emacs, el código para inspeccionar y backtrace funcionalidades se debe establecer que. El desarrollo quiere mostrar esto: para el usuario/programador, el estándar Common Lisp no proporciona esa información.

+1

Gracias esta información es lo que estaba buscando. –

4

Puede tener varias funciones dentro de un recinto, por lo que sólo tiene que añadir otra función

(defun inspect-closure() (list (list 'x x) (list 'y y) (list 'z z))) 

y poner dentro de su declaración let

Si usted está tratando de crear una función que vaya a acceder cierre -Cualquiera- entonces, estrictamente hablando, no creo que sea posible. x, y, y z se definen localmente, por lo tanto, si desea anunciarlos al mundo, tiene que provenir del cierre. Lo que PODRÍA hacer es crear una macro que duplica la funcionalidad let con la capacidad añadida de devolver sus variables locales. Probablemente quieras nombrarlo de otra manera, como mylet o lo que sea.

+1

Gracias Jeff, pero estoy buscando para el acceso mediante programación a las variables cerrados como una función de tipo listing- o al estilo de inspección. Aparentemente no es compatible con CL estándar. –

+1

Entonces, creo, según la segunda parte de mi respuesta, tu mejor opción es crear una macro. ¡Lo siento, no podríamos ser de más ayuda! – Jeff

Cuestiones relacionadas