В LISP, как проверить свободные переменные в замыкании? - PullRequest
6 голосов
/ 29 мая 2011

В lisp я могу связать свободные переменные, связанные в замыкании, как это ...

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

(free-variables)

приводит к ...

6

Что я хочу знать, так этоможно динамически проверять связанные переменные замыкания?

Например,

(inspect-closure free-variables)

, что приводит к чему-то вроде ...

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

Спасибо SO

Ответы [ 2 ]

7 голосов
/ 29 мая 2011

Обычный Лисп

Доступ к внутренним переменным замыкания возможен только из функций той же области (см. Ответ Джеффа). Даже те, кто не может где-нибудь запросить эти переменные. Эта функциональность не предоставляется стандартом Common Lisp.

Очевидно, что во многих случаях отдельные реализации Common Lisp знают, как получить эту информацию. Если вы посмотрите, например, на код SLIME (среду разработки Common Lisp) для GNU Emacs, код для функций inspect и backtrace должен это обеспечить. Разработка хочет показать это - для пользователя / программиста стандарт Common Lisp не предоставляет эту информацию.

4 голосов
/ 29 мая 2011

Вы можете иметь несколько функций внутри корпуса, поэтому просто добавьте еще одну функцию

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

и поместите ее в let выражение

Если вы пытаетесь создать функциюэто даст доступ к любому закрытию, тогда, строго говоря, я не думаю, что это возможно.x, y и z определены локально, поэтому, если вы хотите объявить их миру, это должно произойти из замыкания.Что вы МОЖЕТЕ сделать, так это создать макрос, который дублирует функциональность let с добавленной возможностью возвращать его локальные переменные.Возможно, вы захотите назвать это как-то по-другому, например, mylet или как-то еще.

...