日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Common Lisp学习之一:初识CL的语法与语义

發(fā)布時(shí)間:2024/3/7 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Common Lisp学习之一:初识CL的语法与语义 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Lisp是一類(lèi)語(yǔ)言的統(tǒng)稱(chēng),指那些使用前綴表達(dá)式和S表達(dá)式進(jìn)行代碼編寫(xiě)和編譯的語(yǔ)言。此類(lèi)語(yǔ)言有CL,Scheme,Racket,Clojure等。Lisp語(yǔ)言和其他語(yǔ)言相比,其優(yōu)勢(shì)在于無(wú)比強(qiáng)大的抽象能力。可以在代碼層面上進(jìn)行抽象,利用Lisp的元編程技術(shù),構(gòu)造特定領(lǐng)域的DSL,進(jìn)行自底向上的逐層開(kāi)發(fā)。

CL作為其中發(fā)展比較完善和標(biāo)準(zhǔn)化的一個(gè)分支,完全可以完成各種大型項(xiàng)目的開(kāi)發(fā)需要。CL的學(xué)習(xí)資源也比較多。其中比較權(quán)威的如下:

ANSI Common Lisp中文翻譯?http://acl.readthedocs.org/en/latest/ Common Lisp HyperSpec標(biāo)準(zhǔn)全文?http://www.lispworks.com/documentation/HyperSpec/Front/Contents.htm 實(shí)用CommonLisp編程的英文版?http://gigamonkeys.com/book/? 本書(shū)獲得了第16屆Jolt生產(chǎn)效率獎(jiǎng)
本系列的文章主要以實(shí)用CommonLisp為主,輔以ANSI CL的部分內(nèi)容。

Common Lisp定義了兩個(gè)黑箱,每個(gè)黑箱都定義了一個(gè)語(yǔ)法層面:一個(gè)將文本轉(zhuǎn)換為L(zhǎng)isp對(duì)象(S-表達(dá)式),稱(chēng)其為讀取器;另一個(gè)將Lisp對(duì)象轉(zhuǎn)換轉(zhuǎn)換為L(zhǎng)isp的語(yǔ)義,稱(chēng)此為求值器。
讀取器定義字符串如何轉(zhuǎn)換為S表達(dá)式,而求值器定義了構(gòu)建在S表達(dá)式之上的Lisp形式的語(yǔ)法。并非所有的S表達(dá)式都是合法的Lisp形式,當(dāng)然并非所有字符序列都是合法的S表達(dá)式。
下面先展示一段Lisp代碼,定義了求值一個(gè)列表中最值的函數(shù),通過(guò)它,認(rèn)識(shí)一下CL的樣子。 (defun (max-list alist)(if (empty? (rest alist))(first alist)(let ((defun rest-max (max-list (rest alist))))(if (> (first alist) rest-max)(first alist)rest-max))))(max-list '(1 2 3 4 5)) //5 從這個(gè)例子中,直觀上看到的是一堆的括號(hào),括號(hào)中是一系列的關(guān)鍵字、函數(shù)名、變量等。其中每個(gè)可匹配的括號(hào)內(nèi)都是一個(gè)列表,這也是LISP語(yǔ)言的由來(lái),即LISt Process語(yǔ)言。
1 S-表達(dá)式 S-表達(dá)式的基本元素是列表和原子。
列表由括號(hào)包圍,包含任何數(shù)量由空格分隔的元素,列表可以為嵌套的。如(1 2 (3 4)) ()均為列表,后者為空列表。
原子是所有其他內(nèi)容,如數(shù)字、字符串和名字。如2、"hello world"和alist
數(shù)字支持分?jǐn)?shù)1/2、浮點(diǎn)數(shù)、整數(shù)、復(fù)數(shù)等。 字符串由雙引號(hào)包圍,\作為轉(zhuǎn)義字符。因此必須要轉(zhuǎn)義的字符是雙引號(hào)和\本身。此外諸如括號(hào),引號(hào),冒號(hào)等10個(gè)標(biāo)點(diǎn)如果想放在符號(hào)里也需要轉(zhuǎn)義,或者用||框起來(lái)。 名字可以是變量名、函數(shù)名、宏名。
2 符合Lisp形式的S-表達(dá)式 原子被分成兩類(lèi):符號(hào)和除符號(hào)外其他內(nèi)容。
符號(hào)在作為L(zhǎng)isp形式被求值時(shí)被視為一個(gè)變量名如例子中的alist,并且會(huì)被求值為變量的當(dāng)前值。 除了符號(hào)外而其他的原子,包含數(shù)字和字符串,都是自求值的對(duì)象。
列表的求值更復(fù)雜一些,合法的列表均以一個(gè)符號(hào)開(kāi)始,根據(jù)符號(hào)類(lèi)型不同分為三種表達(dá)式,即函數(shù)調(diào)用、宏形式和特殊形式。
2.1 函數(shù)調(diào)用 函數(shù)調(diào)用形式的求值規(guī)則很簡(jiǎn)單,對(duì)以L(fǎng)isp形式存在的列表其他元素進(jìn)行求值并將結(jié)果傳遞到命名函數(shù)中。這一規(guī)則要求列表元素自身必須也是形態(tài)良好的Lisp形式。例如示例中的(max-list '(1 2 3 4 5))
2.2 特殊操作符 由于在函數(shù)調(diào)用之前,函數(shù)參數(shù)都必須被求值。對(duì)于某些不必要先求值的時(shí)刻,使用函數(shù)便無(wú)法達(dá)到目的。因此不能將所有的操作都定義成函數(shù),需要語(yǔ)言提供特殊的符號(hào),即關(guān)鍵字。如IF,quoto等,CommonLisp提供了25個(gè)關(guān)鍵字。
2.3 宏 宏提供了Lisp強(qiáng)大的擴(kuò)展能力。宏接受S-表達(dá)式,并輸出其轉(zhuǎn)換形式。在編譯時(shí),所有的宏會(huì)被展開(kāi)。所以在執(zhí)行時(shí)代碼中不包含宏。
3 真、假與等價(jià) NIL是唯一的假值,其余都是真值,T是標(biāo)準(zhǔn)的真值。同時(shí)NIL即是原子也是空列表。 相等測(cè)試有EQ,EQL,EQUAL和EQUALP,建議不要使用EQ。這幾個(gè)符號(hào)支持的類(lèi)型趨向于寬松。 EQL只有當(dāng)兩個(gè)對(duì)象是同一對(duì)象時(shí)才返回真,而EQUAL只要兩個(gè)對(duì)象打印出來(lái)的值相等,就返回真。

總結(jié)

以上是生活随笔為你收集整理的Common Lisp学习之一:初识CL的语法与语义的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。