回答
在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
,並且將返回一個未命名的功能,將「捕獲「這個綁定。當調用返回的未命名函數時,綁定將仍然存在,這是使用簡單的「堆棧幀」無法實現的。
(對於OP)還要注意'square'和'kmul'也是詞法綁定的,在函數名稱空間。 – coredump
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只有動態綁定,從而關閉在不存在,因此proc
和initial-arg
會,如果你試圖不被我們所說的產生程序的時間定義與Scheme示例相同。只要不混合靜態和動態變量名稱,它在CL中工作。
在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詞彙表條目]
只是符號和框之間的關聯不是所謂的綁定。
未結合動態變量,即使符號仍然有值單元格(除T
,NIL
和關鍵字符號之外,不言而喻:但要注意的關鍵字支持功能綁定)。對於一個動態可變是未結合(作爲從未被束縛,或具有一直受到makunbound
的結果)並不意味着「不具有值單元」。
用於動態結合的Common Lisp的模型是該值或者細胞保持的值,否則以某種方式表明不存在的值。例如,實現可以將值單元表示爲具有兩個插槽的對象:一個存儲值,一個布爾插槽,如果值單元格當前綁定則爲true,如果未綁定,則爲false。或者,值單元格可以只有一個槽,並且可以將某個特定對象(只有實現知道,而不是用戶代碼)存儲爲值單元格中的值以指示「此單元格是未綁定的」。
所以,這些都是結合兩個主要概念:與在環境中的位置的關聯,以及synecdochal使用的「結合」作爲這樣一個位置的只是價值。這就產生了兩種可能的「不受約束」的含義:不與位置有關聯(環境中沒有條目),或者與某個值沒有關聯(儘管與環境中的位置有關聯)。
如果你有一個Lisp的對話,它有助於明確,因爲這些區別會導致誤解,由於雙方使用略有不同的定義。
- 1. 各種語言的關鍵編程概念和術語
- 2. 學習編程語言概念
- 3. 關於scala語言的多線程概念
- 4. C語言中的線程概念#
- 5. TYPO3多語言概念
- 6. 關於表達和陳述的語言概念
- 7. lisp概念和術語幫助需要
- 8. 關於RDBMS概念
- 9. 關於java編程語言
- 10. 關於封裝的概念
- 11. C語言編程,想了解一些概念
- 12. 掛毯中的多語言概念5
- 13. 關於框架(概念)
- 14. 關於java-RMI概念
- 15. 「幻數」的概念是否從語言變爲語言?
- 16. C基本編程概念
- 17. 3D編程概念指南?
- 18. 編程問題和概念
- 19. 數據庫編程概念
- 20. 其他語言中的「未定義」的任何類似概念?
- 21. 不同語言的程序和功能在每種編程語言中的概念不相同
- 22. 什麼語言有「保護」關鍵字或概念?
- 23. 在理解MOV概念時遇到問題(彙編語言)
- 24. 靜態和動態綁定的概念
- 25. 序列化概念在編程語言中的含義是什麼?
- 26. 所有編程語言都有NIL,null或undefined的清晰概念嗎?
- 27. 關於JavaScript中的原型概念
- 28. 關於接口概念的說明
- 29. 關於Mulesoft的一些概念問題
- 30. 關於面向對象的概念
有幾種不同的編程語言,可以說「口齒不清」語言(intance Common Lisp的,計劃/球拍,的Emacs Lisp,Clojure中,Lisp的1.5等),有* *不同種類的結合。你應該把你的問題放在一些特定的語言上(並且在那種情況下,我認爲這個問題對於SO來說太寬泛了), – Renzo