2016-11-26 75 views
0

什麼是LISP程序語言綁定的概念?關於LISP編程語言的綁定概念

是動態還是靜態?或者沒有其中一個?

任何人都可以在這方面支持。

+0

有幾種不同的編程語言,可以說「口齒不清」語言(intance Common Lisp的,計劃/球拍,的Emacs Lisp,Clojure中,Lisp的1.5等),有* *不同種類的結合。你應該把你的問題放在一些特定的語言上(並且在那種情況下,我認爲這個問題對於SO來說太寬泛了), – Renzo

回答

1

在Lisp中,「變量」被描述爲稱爲「綁定」的名稱 - >值關聯;一組綁定被命名爲「環境」。

舉例而言,當你有一個函數

(defun square (x) 
    (* x x)) 

,你在函數調用函數與

(square 12) 

進入一個新的「環境」將被建立,包含「綁定」 x -> 12

在C++ - 等語言這些概念通常被稱爲「堆棧幀」(環境)和「局部變量」(綁定)。但是請注意不是「堆棧幀」的想法無法用語言形容採集過程中的Lisp例如正確會發生什麼:

(defun kmul (k) 
    ;; returns a function that multiplies by k its argument 
    (lambda (x) (* x k))) 

(let ((k12 (kmul 12))) 
    (print (funcall k12 3))) ; --> 36 

在此處輸入kmul將有一個環境,包含結合k -> 12,並且將返回一個未命名的功能,將「捕獲「這個綁定。當調用返回的未命名函數時,綁定將仍然存在,這是使用簡單的「堆棧幀」無法實現的。

+0

(對於OP)還要注意'square'和'kmul'也是詞法綁定的,在函數名稱空間。 – coredump

2

LISP和Common Lisp一樣都有。所有全局變量都是動態綁定的,或者CL專用。

(defparameter *par* 5) 
(defvar *var* 10) 

(defun test() 
    (+ *par* *var*)) 

(test) ; ==> 15 

(let ((*par* 9) (*var* 21)) 
    (test)) ; ==> 30 

現在,如果變量將是靜態的,你應該有來自呼叫test相同的結果,但事實並非如此。

如果通過命名具有相同名稱的本地綁定作爲一個全球性,你可以得到由使用這些,他們就很難發現其他呼叫奇怪的結果一致。爲了不把全局變量與詞法混淆,有一個使用*earmuffs*的命名約定,這也許是CL中最重要的約定。

其他的東西都是靜態的(或詞法)。

雖然還有其他類型的LISP。例如。 Scheme只有靜態綁定。因此,上面轉換爲Scheme的例子每次都會產生15。有關靜態綁定一件特殊的事情都是閉包:

(define (get-proc proc initial-arg) 
    (lambda args 
    (apply proc initial-arg args))) 

(define add10 (get-proc + 10)) ; the + and 10 are bound in the result 
(define div10 (get-proc/10)) ; the - and 10 are bound in the result 

(add10 2) ; ==> 12 
(div10 2) ; ==> 5 

PicoLisp只有動態綁定,從而關閉在不存在,因此procinitial-arg會,如果你試圖不被我們所說的產生程序的時間定義與Scheme示例相同。只要不混合靜態和動態變量名稱,它在CL中工作。

0

在Lisp中有一個綁定的兩個主要概念。我會隨意地調用第一個傳統的,也許是錯誤的,第二個是ANSI Lisp。

第一傳統概念是,結合是關聯,在一些環境的上下文中,一個符號和保持的值的位置之間。這正是通過肯特皮特曼在的結合的定義在這些詞中給出的紙張"Technical Issues of Separation in Lisp Function Cells and Value Cells"描述:

結合是一個標識符的與位置的配對,其中一個Lisp對象可能被放置。

當我們評估一個符號時,我們通過合適的環境來尋找一個綁定(從詞法環境開始,如果存在這樣的事情,則回到動態環境)。在這個環境中,我們發現一些與符號相關聯的單元格,並且在該單元格內是一個存儲框,其中包含一個值。這很清楚。例如,當在評估期間輸入新的詞法範圍時,一些框會被創建並通過新環境中的條目與符號相關聯,這就是我們如何獲得「新鮮的綁定」的方式。

在ANSI Common Lisp的,上面的術語是由提喻,由此ANSI CL術語結合是指只是一個以上綁定的組件替換:它是一個符號及其值之間的關聯 。也就是說,只是把東西放進那個儲物盒裏。或者可替換地,可以把它作爲不是提喻但更高的水平視圖:其中可變連接到盒(如果有的話),並從那裏到值的整個機構被「結合」:

結合ñ。一個名稱並且其中名稱表示之間的關聯。 「詞彙綁定是名稱與其價值之間的詞彙關聯。」當術語結合命名空間,如「可變」或的名稱限定「功能」,它限制於所指示的命名空間的結合,如在:「let建立變量綁定」。或「let建立變量的綁定」。 [ANSI CL詞彙表條目]

ANSI CL不會否認存在存儲盒。例如,在ANSI CL所有符號具有 「值細胞」:

值細胞ñ。繁體該地方其保持,如果有的話,由該符號評爲動態變量的,並且其中(a 符號的)是通過符號值訪問。請參閱單元格。 [ANSI CL詞彙表條目]

只是符號和框之間的關聯不是所謂的綁定。

未結合動態變量,即使符號仍然有值單元格(除TNIL和關鍵字符號之外,不言而喻:但要注意的關鍵字支持功能綁定)。對於一個動態可變是未結合(作爲從未被束縛,或具有一直受到makunbound的結果)並不意味着「不具有值單元」。

用於動態結合的Common Lisp的模型是該值或者細胞保持的值,否則以某種方式表明不存在的值。例如,實現可以將值單元表示爲具有兩個插槽的對象:一個存儲值,一個布爾插槽,如果值單元格當前綁定則爲true,如果未綁定,則爲false。或者,值單元格可以只有一個槽,並且可以將某個特定對象(只有實現知道,而不是用戶代碼)存儲爲值單元格中的值以指示「此單元格是未綁定的」。

所以,這些都是結合兩個主要概念:與在環境中的位置的關聯,以及synecdochal使用的「結合」作爲這樣一個位置的只是價值。這就產生了兩種可能的「不受約束」的含義:不與位置有關聯(環境中沒有條目),或者與某個值沒有關聯(儘管與環境中的位置有關聯)。

如果你有一個Lisp的對話,它有助於明確,因爲這些區別會導致誤解,由於雙方使用略有不同的定義。