标签为“Lisp”的页面如下
【閱讀筆記】Common Lisp相關好文閱讀筆記
我對Common Lisp的喜愛應該不用多說。我不知道他還可以帶給我多少驚喜。
節錄幾個Common Lisp文章的相關敘述。
超凡脫俗的極限 - Common Lisp 文/田春
在文中最後寫:
原文: 超凡脫俗的極限 文/田春 鏈接已失效。
我閱讀位置:https://open343.github.io/Writing/zh-cmn-Hant/Overworldly-Common-Lisp.html
這應該是我第二次看,第一次看應該是在原本連結處。
語法
中序表達式可以徹底避免運算符優先級,例如 C 語言的表達式 1+23 在 Lisp 中將寫成 (+ 1 ( 2 3)) ,其中的 + 和 * 都是普通函數的名稱,和其他用戶定義的函數沒有區別。 值得注意的是,小括號的使用並不是必須,只是 Lisp 讀取器的一種標識,完全可以定製。如果用戶喜歡用中括號甚至後序表達式來描述 Lisp 程序,也是有可能的,相關的方法請查詢 Common Lisp 的 get-macro-character 和 set-macro-character 函數。
高度賦予程式成員自由性
Common Lisp 是唯一的允許程序員控制從源代碼到目標程序的所有方面的編程語言 。典型的 Lisp 代碼的處理分為三個階段:讀取、編譯、加載以及執行,其中每個階段都允許程序員介入。
- 在讀取階段,用戶可以設置特殊的讀取宏,用簡潔的形式讀取用戶自定義的對象;
- 在編譯階段,通過定義宏可以執行任意代碼來生成被編譯器所讀取的代碼;
- 在程序加載階段,附加的代碼有機會被執行,例如全局變量的初始化;
- 而在最終的程序執行階段,Lisp 系統還仍然有機會繼續編譯和加載程序的其餘部分,例如補丁,因為包括 compile 和 load 在內的函數是語言規範的一部分。
在讀取階段有set-macro-character
等讀取宏(read macro,我更喜歡使用原文。宏或巨集都不太能表達其強大)。
在編譯階段有defmacro
、define-compiler-macro
等可以使用。
適合嵌入使用的程式語言 在Raspberry Pi上的編譯紀錄
幾乎所有應用都不可能只使用一個程式語言完成。
忘了是那看過的,現在想想,當時他所說的,或許不只是ABI、與C交互、或是組合語言,像是應用層面的HTML,或是通訊成面的HTTP等,應也可以視為程式語言裡的異語言。既然無可避免,那多少了解一些其他語言也是必須的(不過近期打算更進一步XD),不過我自己初衷很單純是「興趣」(原來是興趣使然的程式語言研究員阿)。
之前曾經找過適合作為嵌入式,嵌入到其他程式語言的腳本語言有哪些。
當然是受到最適合、也是以此為目標設計的Lua影響,但Lua及其簡單,就表達層面上,不適合作為複雜應用。
拿個簡單的例子來說,同為原形設計的物件導向程式語言–EMCAScript後來在ES6也有了class
的語法糖。
總之,Lua很簡單,執行效率也極高,這想點我想是相輔相成的,也沒比要為了語法糖提高其語言解析(parse)的難度。但同樣作為一個圖靈完全(Turing completeness)的程式語言,Lua必然也可以實現複雜應用。
但既然Lua已經幾乎達到其設計目標,那如果需要其他設計方法怎辦,作法之一是使用Python這類膠水語言(glue language,Lua也是),但不管是CPython、CRuby還是Node.js恐怕實現都有些過於「肥大」。繞個路的作法就是使用其他實現,接著帶大伙看看幾個我認為有潛力的語言實現。