引入靜態變量_Common Lisp變量的一些事情

94d3edf791144e1aecab495c8e93a2d6.png

Lisp-1 vs Lisp-2[1]

Scheme的求值模型非常簡單:只是用一個名字空間,所有表達式中相應位置的值應該是明確的。

Common Lisp和Scheme最大的不同是,函數名字空間和數據的名字空間是分離的。操作函數名字空間的語句包括,defunfletlabelsdefmethoddefgeneric等方法。要用函數名作為另一個函數的參數來傳遞函數時,需要使用function特殊操作符或者使用#'

我們稱Scheme的變量模型為Lisp-1,Common Lisp的變量模型是Lisp-2.

綁定

在編程語言中綁定是變量名(變量標識符)和對象(保存于內存中的存儲單元,數據或代碼)的映射關系。在這個綁定過程中是作用域有密不可分的關系,作用域決定了哪個變量綁定了哪個存儲單元。

為變量建立綁定之后,就可以通過變量名來引用其所綁定的值。綁定的具體含義,可以參考下圖

5170cdcd293fc267ce9e6852b5c8f7db.png

詞法作用域(lexical scoping)

詞法作用域又叫靜態作用域(static scope)。顧名思義,詞法變量即是使用詞法作用域的變量。在詞法作用域里,一個變量的變量名只能在一個函數或一段代碼區域( block )內存在,此時變量名才會綁定到變量的值。

詞法變量擁有不確定的生存期,即從時間上來講,一個詞法變量可以在任意的時間里持續存在,取決于該變量需要被使用(reference)多久。 詞法作用域里,對于函數體中的一個符號,不會逐層檢查函數的調用鏈,而是檢查函數定義時的外部環境,即捕捉的是函數定義時該符號的綁定。

動態作用域(dynamic scoping)

使用動態作用域的變量叫做動態(dynamic)變量,有時也叫做特殊(special)變量。動態作用域里,每個變量名(變量標識符)都擁有一個全局的綁定棧。引入一個與動態變量同名的局部變量會為此變量名創建一個新的變量綁定并將其壓入此變量名的全局綁定棧中,一個全局的變量名(變量標識符)總是引用當前其棧頂的綁定,當使用該變量綁定的代碼執行完畢(即程序控制流離開了此變量的作用域),該變量綁定就會從此變量名的全局綁定棧中被彈出,該變量綁定就失效。

動態作用域表示的范圍是不確定的,可從任何位置訪問一個動態變量,取決于它們在什么地方被綁定。動態變量擁有動態的生存期。因容易引起誤會而需要注意的是,不確定的作用域和動態生存期的組合經常被錯誤地稱為動態作用域(dynamic scope)。

動態作用域里,函數執行遇到一個符號,會由內向外逐層檢查函數的調用鏈,并打印第一次遇到的那個綁定的值。最外層的綁定即是全局狀態下的那個值。

Common Lisp的例子

請看下面的代碼

(let ((y 7))(defun foo (x)(print x)(print y)))(let ((y 5))(foo 1))

我們通過SLIM執行后,可以得到輸出1和7,這說明Common Lisp使用的是詞法作用域。在foo中尋找y的綁定時,它檢查函數foo的詞法上下文。

再請看下面代碼

(let ((y 7))(defun foo (x)(print x)(print y)(setq y (+ y 2))))(let ((y 5))(foo 1)(foo 1))(let ((y 5))(foo 2))

我們通過SLIM執行后,我們會看到,1,7,1,9,2和11。在例子中的第一個let表里,定義了一個變量,符號名為y并綁定了值7,那么這個y的作用域就是這個let表區域。 foo函數定義在這個區域內,其內部會使用到一個符號名為y的變量。 那么在詞法作用域的情況下,當foo被調用時,其會查找其定義的環境有沒有符號名y的變量可以綁定,如果有則把foo中符號y的值綁定,在這里就是7。 并且這里foo中的y和外部let中的y共享一個值,都是對這個值的引用,并不是拷貝了一個新值。

參考

  1. ^https://en.wikipedia.org/wiki/Common_Lisp#The_function_namespace

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/539298.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539298.shtml
英文地址,請注明出處:http://en.pswp.cn/news/539298.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JobTracker和TaskTracker

轉載:http://blog.csdn.net/keda8997110/article/details/8348705 ----------------------------------------------------------------------------------------- JobTracker和TaskTracker JobTracker 對應于 NameNode TaskTracker 對應于 DataNode DataNode 和Na…

c理c利用計算機怎么彈,通過匯編一個簡單的C程序,分析匯編代碼理解計算機是如何工作的...

通過匯編一個簡單的C程序,分析匯編代碼理解計算機是如何工作的計算機的工作方式:現代計算機的基本體系結構都是采用馮諾依曼結構,馮諾依曼的設計思想最重要之處是"存儲程序"的這個概念。計算機的工作過程,就是執行程序的…

Linux安裝MySQL的兩種方法

原文鏈接:http://blog.csdn.net/superchanon/article/details/8546254 --------------------------------------------------------------------------------------- 1. 運行平臺:CentOS 6.3 x86_64,基本等同于RHEL 6.3 2. 安裝…

jenkins 手動執行_想知道如何用Jenkins自動執行Python腳本輸出測試報告?

前言在用python做自動化測試時,我們寫好代碼,然后需要執行才能得到測試報告,這時我們可以通過 Jenkins 來進一步完成自動化工作。借助Jenkins,我們可以結合 Git/SVN 自動拉取代碼,可以設置定時構建,接著就可…

VR 影院,約嗎?

世界第一家 VR 影院已經開張,朋友,去不? 世界第一家 VR 影院正式開張 (無大屏的 VR 電影院) 在被稱為 VR 元年的 2016 年,越來越多的人加入了這個新興的領域,各種傳統應用也在被 VR 包裝之后以…

redis cluster 分布式鎖_關于分布式鎖原理的一些學習與思考redis分布式鎖,zookeeper分布式鎖...

首先分布式鎖和我們平常講到的鎖原理基本一樣,目的就是確保,在多個線程并發時,只有一個線程在同一刻操作這個業務或者說方法、變量。在一個進程中,也就是一個jvm 或者說應用中,我們很容易去處理控制,在jdk …

會計行業被計算機取代馬云,會計人:為什么我神煩“人工智能取代說”?

原標題:會計人:為什么我神煩“人工智能取代說”?原創來源:學會計有方法從財會機器人誕生到馬云的無人商店,全行業掀起了一股“人工智能取代說”的熱潮。有些財會朋友在一輪又一輪的信息轟炸下,倍感壓力&…

mysql5.6允許遠程服務器訪問數據庫

創建一個mysql用戶,并設置可以遠程訪問 grant usage on *.* to fredlocalhost identified by fred;//創建用戶fred密碼ferdselect host,user,password from mysql.user where userfred;//查看記錄 grant all privileges on *.* to fred%identified by fred;//設置可以遠程訪問…

sp烘焙流程_小手雷-PBR材質流程(一)——(基本材質)

小手雷-PBR材質流程(一)Substance Painter生存手冊經過了12個章節的講解后,已經完結了(。・ω・。)相信大家經過了生存手冊這一基礎教程過后,對Substance Painter這款軟件已經有了比較堅實的基礎了,…

MyBatis-進階2

typeHandler typeHandler有什么用? 你可以重寫類型處理器或創建你自己的類型處理器來處理不支持的或非標準的類型。 具體做法為:實現 org.apache.ibatis.type.TypeHandler 接口, 或繼承一個很便利的類 org.apache.ibatis.type.BaseTypeHandle…

python中 r是什么意思_python中rb含義理解

Python文件讀寫的幾種模式: r,rb,w,wb 那么在讀寫文件時,有無b標識的的主要區別在哪里呢? 文件使用方式標識 r:默認值,表示從文件讀取數據 w:表示要向文件寫入數據,并截斷以前的內容 a:表示要向文件寫入數據&#xff0…

哈佛大學計算機生物科學,生命科學專業

【出國留學網】昨日,泰晤士報公布了最新版2018年世界大學生命科學排名,哈佛大學位列第一。本文是關于世界各國大學在本次生命科學排名中的具體表現,供你選校參考。The 2018 Times Higher Education World University Rankings’ table for li…

怎樣呵護友誼_呵護真正的友情,助力漫長的人生

友情,即友誼,是指朋友和朋友之間的感情。它是一種很美妙的東西,可以讓你在失落的時候變得高興起來,可以讓你走出苦海,去迎接新的人生。它就像一種你無法說出又可以感到快樂無比的東西。只有擁有真正朋友的人&#xff0…

【Day41】Python之路——AJAX

什么是AJAX AJAX Asynchronous JavaScript and XML(異步的 JavaScript 和 XML)。 優點: 不重新加載整個頁面的情況下,可以與服務器交換數據并更新部分網頁內容 不需要任何瀏覽器插件,但需要用戶允許JavaScript在瀏覽器上執行 同源…

LINUX重啟MYSQL的命令

原文:http://blog.csdn.net/liuyong0818/article/details/5693336 ------------------------原文有錯誤,本文轉載時已修改--------- 如何啟動/停止/重啟MySQL 一、啟動方式 1、使用 service 啟動:service mysql start 2、使用 mysql 腳…

html css子標簽,HTML+CSS系列:CSS選擇器(標簽、ID、類、通配符、后代、子元素、并集、偽類)...

一.標簽選擇器Documenth1 {color: red;}h2{color: green;}Hello World!Hello World!Hello !Hello !二.類選擇器Document.box {color: green;}.box1 {font-size: 26px;}Hello World!Hello World!三.ID選擇器Document#box{color: green;}Hello World!四.通配符選擇器Document*{ma…

aes離線解密工具_如何在Python中解密OpenSSL AES加密文件?

OpenSSL為AES加密提供了一種流行的(但不安全 - 見下文!)命令行界面:openssl aes-256-cbc -salt -in filename -out filename.encPython以PyCrypto包的形式支持AES,但它只提供工具。如何使用Python / PyCrypto解密使用OpenSSL加密的文件&#…

什么是Hive

Hive 是建立在 Hadoop 上的數據倉庫基礎構架。 它提供了一系列的工具,可以用來進行數據提取轉化加載(ETL ),這是一種可以存儲、查詢和分析存儲在 Hadoop 中的大規模數據的機制。 Hive 定義了簡單的類 SQL 查詢語言&#xff0c…

VUE-搜索過濾器

VUE非常實用的搜索過濾&#xff0c;喜歡點個贊哦 廢話不多說&#xff0c;先來看看效果 1 引入vue <script src"https://cdn.jsdelivr.net/npm/vue"></script>2 HTML <div id"app"><input v-modelsearch /><ul v-if"search…

單選按鈕必填會有紅色選中提示嗎_為什么單選按鈕和復選框不能共存?

以下內容由摹客團隊翻譯整理&#xff0c;僅供學習交流&#xff0c;摹客設計協作一站式云平臺&#xff0c;從產品、設計到開發&#xff0c;摹客來解決。單選按鈕和復選框長期以來一直都是容易導致用戶困惑的組件。這兩個組件通常用于相同的情景下&#xff0c;但看起來又完全不同…