Common Lisp学习之一:初识CL的语法与语义
生活随笔
收集整理的這篇文章主要介紹了
Common Lisp学习之一:初识CL的语法与语义
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Lisp是一類語言的統稱,指那些使用前綴表達式和S表達式進行代碼編寫和編譯的語言。此類語言有CL,Scheme,Racket,Clojure等。Lisp語言和其他語言相比,其優勢在于無比強大的抽象能力。可以在代碼層面上進行抽象,利用Lisp的元編程技術,構造特定領域的DSL,進行自底向上的逐層開發。
CL作為其中發展比較完善和標準化的一個分支,完全可以完成各種大型項目的開發需要。CL的學習資源也比較多。其中比較權威的如下:
ANSI Common Lisp中文翻譯?http://acl.readthedocs.org/en/latest/ Common Lisp HyperSpec標準全文?http://www.lispworks.com/documentation/HyperSpec/Front/Contents.htm 實用CommonLisp編程的英文版?http://gigamonkeys.com/book/? 本書獲得了第16屆Jolt生產效率獎
本系列的文章主要以實用CommonLisp為主,輔以ANSI CL的部分內容。
Common Lisp定義了兩個黑箱,每個黑箱都定義了一個語法層面:一個將文本轉換為Lisp對象(S-表達式),稱其為讀取器;另一個將Lisp對象轉換轉換為Lisp的語義,稱此為求值器。
讀取器定義字符串如何轉換為S表達式,而求值器定義了構建在S表達式之上的Lisp形式的語法。并非所有的S表達式都是合法的Lisp形式,當然并非所有字符序列都是合法的S表達式。
下面先展示一段Lisp代碼,定義了求值一個列表中最值的函數,通過它,認識一下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 從這個例子中,直觀上看到的是一堆的括號,括號中是一系列的關鍵字、函數名、變量等。其中每個可匹配的括號內都是一個列表,這也是LISP語言的由來,即LISt Process語言。
1 S-表達式 S-表達式的基本元素是列表和原子。
列表由括號包圍,包含任何數量由空格分隔的元素,列表可以為嵌套的。如(1 2 (3 4)) ()均為列表,后者為空列表。
原子是所有其他內容,如數字、字符串和名字。如2、"hello world"和alist
數字支持分數1/2、浮點數、整數、復數等。 字符串由雙引號包圍,\作為轉義字符。因此必須要轉義的字符是雙引號和\本身。此外諸如括號,引號,冒號等10個標點如果想放在符號里也需要轉義,或者用||框起來。 名字可以是變量名、函數名、宏名。
2 符合Lisp形式的S-表達式 原子被分成兩類:符號和除符號外其他內容。
符號在作為Lisp形式被求值時被視為一個變量名如例子中的alist,并且會被求值為變量的當前值。 除了符號外而其他的原子,包含數字和字符串,都是自求值的對象。
列表的求值更復雜一些,合法的列表均以一個符號開始,根據符號類型不同分為三種表達式,即函數調用、宏形式和特殊形式。
2.1 函數調用 函數調用形式的求值規則很簡單,對以Lisp形式存在的列表其他元素進行求值并將結果傳遞到命名函數中。這一規則要求列表元素自身必須也是形態良好的Lisp形式。例如示例中的(max-list '(1 2 3 4 5))
2.2 特殊操作符 由于在函數調用之前,函數參數都必須被求值。對于某些不必要先求值的時刻,使用函數便無法達到目的。因此不能將所有的操作都定義成函數,需要語言提供特殊的符號,即關鍵字。如IF,quoto等,CommonLisp提供了25個關鍵字。
2.3 宏 宏提供了Lisp強大的擴展能力。宏接受S-表達式,并輸出其轉換形式。在編譯時,所有的宏會被展開。所以在執行時代碼中不包含宏。
3 真、假與等價 NIL是唯一的假值,其余都是真值,T是標準的真值。同時NIL即是原子也是空列表。 相等測試有EQ,EQL,EQUAL和EQUALP,建議不要使用EQ。這幾個符號支持的類型趨向于寬松。 EQL只有當兩個對象是同一對象時才返回真,而EQUAL只要兩個對象打印出來的值相等,就返回真。
總結
以上是生活随笔為你收集整理的Common Lisp学习之一:初识CL的语法与语义的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DTV 学习(二) 数字视频
- 下一篇: jess笔记_(2)