天天看點

一個實際的Lisp項目開發心得

在萬家燈火,元宵節的煙花絢爛綻放的時刻,checkin了代碼,随手統計了下代碼行,恰好1000行整(包括空行)。冥冥中自有天意?

這個項目是一個分布編譯打包釋出程式,需要控制多台遠端的伺服器進行編譯,編譯過程有很多步驟,還要根據需要增删build 的步驟即參數。

最早的程式是用Python寫的,隻在一台機器上作,後來随着項目越來越複雜,打包編譯花的時間越來越多。于是決定重寫,那誰說重寫代碼是創業公司自殺行為來着?簡直扯淡。

我決定使用 Common Lisp 來重寫它。經過一周多時間,基本完成。

這一千行代碼作的事情卻一點也不少,它包含了:

1. 一個web界面,大概6、7個控制器,兩個主要的view (沒有html模闆檔案,都是通過lisp代碼生成)

2. 一大堆的編譯配置選項

3. 操作資料庫的部分

4. 解析遺留系統 json 檔案的部分

5. 通過ssh 執行指令,并将指令輸出結果顯示到web頁面的部分

6. 編譯任務的部分 : 建立、運作狀态跟蹤、指令輸出

再整理下代碼,估計可以縮減到 700行以内。

通過這個項目實踐,對自己使用lisp的信心更足了。越複雜的項目,它的優勢展現的越明顯。

Common Lisp開發相比其他語言的一個核心優勢是它的開發流程!

通過emacs + slime 這類工具,可以實作程式邊運作邊修改。程式運作中,可以修改函數代碼,也可以修改程式中的變量的值,而不需要重新啟動程式。這一點是相比其他開發語言來說非常顯著的優勢。

用common lisp開發的一個典型工作狀态是: 打開emacs , 通過slime 開始執行程式,然後在源代碼的各處敲敲打打,邊修改邊看執行的狀态,還可以立刻在 repl 環境下修改變量的值。

這種邊運作邊開發的模式與PHP那種還不同,PHP程式雖然修改完可以在網頁上立刻看到效果,但是是重新啟動了一個執行的程序,之前的運作環境都要重新來。

Python也一樣,雖然python有類似Lisp REPL那樣的互動環境,但是卻難以修改源代碼,并非不可能,實在是沒有趁手的工具。

再往下說 Java C++一類編譯型語言,寫程式與編譯調試運作,整個流程分的太開,流程太長。

這種快速增量開發的模式,帶來的就是更高的開發效率,和更複雜問題的處理能力。