2016-05-14 40 views
3

假設我們有一個符號,一個符號值和一個函數值以及一個屬性列表,我們稱之爲q。還假設我們有一個函數f,其形式參數v,例如, (f (v) ...)並調用功能,如(f q)Common-Lisp:綁定形式參數,正是通過了什麼?

我的問題是:究竟是什麼傳遞給v?是

  1. 的值爲q;
  2. 函數值爲q;
  3. q財產清單,

傳遞到形式參數v

如果它們都傳遞給v,那麼我的事實,我們真正需要的功能funcallapply不解。如果v確實同時具有該值和函數值,那麼它當然可以決定當我們編寫(v 3)時,它必須使用函數值v而不是(funcall v 3)。當我們使用(setq v 3)時,它必須使用v的值。

究竟是什麼傳遞給v以及爲什麼v不是符號,而只是一個「參數」或「變量」,這對我來說是一個謎。但我相信它在Lisp 1.5中確實是一個象徵。但在Lisp中,似乎有些混亂的空間。

回答

0

通過變量q的值。

(f q)評價形式,在這種情況下,名稱q被解釋爲一個變量。

如果要訪問功能f中的名稱q的函數值或屬性列表,則需要引用名稱並說'q。通過這樣做,您指的是功能值和屬性列表值的全局註冊表,而不是在功能f內部傳遞的

只有可變q的值被內部功能f通過。

+0

我覺得這個信息非常有幫助。文獻中有時令人困惑。我在文獻中看到了關於這一切的非常不同的觀點和解釋。我有時會懷疑這是不是由lisp的悠久歷史造成的。混淆符號與變量,將函數傳遞給函數,關於綁定的術語是長期混淆的根源。 –

1

既然你引用它,你傳遞的符號q沒有任何價值;這些值可以通過使用(symbol-value v)(symbol-function v)f內訪問。

你需要funcall的原因是因爲Common Lisp的使用符號的函數值,當它出現在列表中,以評估的頭。所以如果你寫

(v 3) 

它會調用符號v的函數值。但是傳遞給f的值的值爲v,而不是函數值。但是,當你寫

(funcall v 3) 

v是參數列表,所以它的評估,以獲得其價值。該值是符號q,當你嘗試調用一個符號,funcall查找其功能價值,所以在這種情況下,這相當於

(funcall (symbol-function v) 3) 
5

如果你有

(f q) 

這意味着調用f的值爲q

  1. Lisp看到f是一個函數,所以整個(f q)是一個函數形式。
  2. Lisp評價q其值。
  3. Lisp通過一個值調用f
  4. Lisp的結合局部變量v到傳遞的值
  5. Lisp的執行函數f 的主體...

v是在源代碼中的符號,但它表示的變量。在編譯後的代碼中,符號消失了。由於Common Lisp使用詞法綁定,所以變量現在是詞法引用。