很久沒給本身的blog澆水了. 昨晚寫的一些東西也是首先發布在douban的LISP小組裏,冷落了自家的blog,罪過啊, 貼回來.
初次發佈的douban小組帖子地址 java
假期抽空看了些SLIME的文檔和源代碼,隨便寫點感覺,主要給LISP的初學者看的,由於這些對老鳥們來講都是老生長談了。下面內容有些雜亂,主要是本身的學習筆記。 python
*SLIME 是一個革命性的開發工具*。它的重要性將在將來幾年內逐漸被主流開發界所認識(主流老是很遲鈍)。任何其餘編程語言,若是不能實現SLIME的功能,則不能稱之爲「高級語言」。 編程
SLIME是: The Superior Lisp Interaction Mode for Emacs 的縮寫。
SLIME 的官方網站: http://common-lisp.net/project/slime/
各類文檔,介紹在上述網站中都有。這個網站看上去很out。但,不要被外表欺騙。它裏面的開發技術與理念很是的領先前衛。 瀏覽器
SLIME是 Emacs 與 Common LISP之間的橋樑,是開發環境與運行環境之間的橋樑。 sass
我我的認爲SLIME最重要的一點意義在於:它強調了快速迭代式的開發方式。首先要了解這一點,而後SLIME的各類特性都是爲這一點服務的。這其實一直是LISP的開發方式。 服務器
SLIME支持遠程開發與熱升級,以前在個人blog上寫過一篇文章介紹: http://www.feime.net/lisp%E5%88%A9%E5%99%A8/%E8%BF%9C%E7%A8%8B%E5%BC%80%E5%8F%91%E8%B0%83%E8%AF%95%E4%B8%8Ehot-update/ 網絡
SLIME的特性包括:
0. Emacs 的slime-mode 包括了lisp代碼的編輯支持,代碼執行,編譯,宏展開,等等
1. 在線文檔
2. REPL
3. 交叉引用
4. 調試
5. Inspector
等等。。 架構
===================
SLIME 與 Emacs, LISP 之間的關係,能夠經過下圖表示: tcp
swank 是LISP下的server,emacs中的slime模塊經過tcp鏈接上swank服務器。使用者在emacs中編寫代碼,發送命令,經過網絡傳遞給lisp進程執行,而後返回結果。
好比,最典型的:咱們在emacs中編寫了一段函數,而後調用 slime-compile-defun 命令(通常用快捷鍵 C-c C-c) , 這段函數的代碼就會發送給lisp進程,lisp進程最終調用compile命令將代碼編譯到進程內部,並返回執行結果,emacs得到結果顯示。
注意,咱們能夠重複定義一個函數,能夠定義新的函數,而LISP進程是一直在那裏的。你能夠隨時去執行任意的命令或函數。你能夠將一大坨測試數據(甚至真實數據)load到LISP的進程中,而後隨便折騰他們。
甚至,你能夠鏈接上一個遠程運行的服務程序,修改裏面的函數定義,或增長新的功能,而不用重啓這個進程。這就是遠程調試和熱升級。
======================
下面演示一些 SLIME 的特性:注意,這些特性不少在LISP環境下均可以直接作到,例如宏展開,反彙編,調試等等,使用SLIME只是更方便而已。這裏不嚴格區分是SLIME的功能仍是LISP的功能,衆所周知,SLIME自古以來就是LISP不可分割的一部分了,是LISP的固有領土。
0. 想一邊寫代碼,一邊測試運行?
沒錯,SLIME就是這麼用的。
1. 想得到更詳細的在線文檔?
當我寫下一個函數時,在emacs下面的minibuffer裏會有一個簡單的文檔:
可是,我不知足,想看看更詳細的文檔怎麼辦?用 slime-hyperspec-look 命令,我綁定到快捷鍵上了,一鍵便可在瀏覽器上打開詳細的文檔。
2. 我想看一段代碼編譯後的彙編代碼?
用 slime-dissassemble-definition
3. 想知道一個函數被誰引用過?
slime-list-callers
xref
4. 想知道一行宏調用展開後是啥德行麼?
slime-macroexpand-1 (all)
5. 查看對象內部的值?
slime-inspect
Inspect Object
想知道一個package的信息?
inspect package 便可
注意,裏面列出的內容是能夠點擊的,回車能夠看到更詳細的信息,好比咱們想知道那1個 external symbols 是什麼:
Inspect Package, show details
這裏 flags 中的 f 表示這個符號是個函數。
===============
未完, 後面還有 SLDB , 調試是個大頭.
學習LISP中,如今用的都是本地的LISP,沒有用過遠程的。
看了文章,個人理解是LISP自己就提供了這種功能,支持在程序運行時插入新的函數(作到熱補丁),修改函數定義(熱升級)。而SLIME則起一個橋樑做用。
不過還有疑問:
一、反覆定義函數,那LISP運行環境是否是隻接受最後一次定義?
二、若是LISP程序正在運行,這時候從新定義了函數,那到底用哪一個函數呢?新定義的仍是之前的?
三、除了LISP,還有其餘支持這種遠程調試和熱升級的語言嗎?我感受編譯型的應該都不支持吧。那python、lua呢?
是的. SLIME就是起了橋樑做用, LISP系統一直就是支持熱升級的.
其實在LISP中寫程序就是擴展LISP的運行環境, 用戶定義的函數與系統提供的函數是同等的地位.
反覆定義的函數, 會記錄最後一個.若是函數正在運行,則不受影響, 當下次再調用時, 會調用新的函數.除了LISP, 還有 Smalltalk 與 LISP的方式很類似(都基於 Image) , 另外 Erlang 也能夠熱升級.
python經過一些手段也能夠實現相似的效果, 但彷佛不多這麼作.