2011-05-29 66 views
6

在口齒不清我可以綁定在這樣的封閉束縛自由變量...在LISP中如何檢查閉包中的自由變量?

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

(free-variables) 

結果...

6 

我想知道的是,如果它能夠檢查綁定動態關閉變量?

E.g.

(inspect-closure free-variables) 

導致類似...

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

感謝這麼

回答

7

Common Lisp的

進入封閉的內部變量是在同一範圍內的功能只可能(見傑夫的答案)。即使是那些不能查詢這些變量的地方。 Common Lisp標準不提供此功能。

顯然,在很多情況下,單獨的Common Lisp實現知道如何獲取這些信息。如果您在GNU Emacs的SLIME代碼(Common Lisp開發環境)中尋找示例,則的代碼將檢查回溯功能應該提供的功能。該開發想要展示這一點 - 對於用戶/程序員,Common Lisp標準不提供這些信息。

+1

感謝這些信息是我一直在尋找的。 – 2011-05-30 12:59:08

4

你可以有多個功能的外殼內,所以只需要添加其他功能

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

,並把它在你的let聲明中

如果你正在嘗試創建一個可以訪問-any-closure的函數,那麼嚴格來說,我認爲這是不可能的。 x,y和z是在本地定義的,所以如果你想向世界宣佈它必須來自閉包。你可以做的是構建一個宏,它複製了let的功能,增加了返回本地變量的能力。你可能會想給它起個不同的名字,比如mylet或其他。

+1

謝謝傑夫,但我正在尋找編程訪問封閉變量,如列表或檢查式的類型函數。顯然它在標準CL中不受支持。 – 2011-05-30 12:58:29

+1

然後我認爲,根據我的答案的第二部分,您最好的選擇是創建一個宏。抱歉,我們無法提供更多幫助! – Jeff 2011-05-30 14:22:11

相關問題