GNU Emacs Lisp編程入門(學(xué)習(xí)筆記)


基本概念

列表

列表由括號括起來揭朝,元素由空格分開队贱。

'(rose violet daisy buttercup)

在LISP中,數(shù)據(jù)和程序都以同樣的方式表示潭袱。都是由空格分隔的柱嫌、由括號括起來的單詞、數(shù)字或者其他列表的列表屯换。列表是LISP的基礎(chǔ)编丘。

原子

原子是LISP里面不可分割的部分。在一個列表中彤悔,原子是由空格意義分割的嘉抓,原子可以緊接著括號。
LISP的一個列表有三中可能的組成方式:

  • 括號和括號中由空格分割的原子
  • 括號和括號中的其他列表
  • 括號和括號中的其他列表及原子

一個沒有任何原子的列表就像這樣()晕窑,它被稱為空列表抑片,可以把它同時看做既是一個原子,也是一個列表杨赤。

在LISP的日常使用習(xí)慣中敞斋,“原子”一詞不太常用,LISP編程幾乎都是關(guān)于列表中的符號的疾牲。另外植捎,在LISP中,所有用雙引號括起來的文本阳柔,包括標(biāo)點符號和空格焰枢,都是單個原子盔沫。這種原子被稱為string医咨。


求值

當(dāng)LISP解釋器處理一個表達(dá)式時,這個動作被稱為“求值”架诞。我們稱拟淮,解釋器計算表達(dá)式的值。

對一個內(nèi)部列表求值

如果對一個嵌套在另一個列表中的列表求值很泊,對外部列表求值時可以使用受限對內(nèi)部列表求值所得的結(jié)果沾谓。這解釋了為什么內(nèi)存列表總是首先被求值的:因為它們的返回值被首先用于外部表達(dá)式。

(+ 2 (+ 3 3))

數(shù)字8就會顯示在回顯區(qū)昏兆。

變量

LISP中妇穴,可以降一個值賦給一個符號爬虱,就像降一個函數(shù)定義賦給一個符號那樣隶债。但兩者含義不同。

  • 函數(shù)定義時一組指令跑筝,這組指令是由計算機(jī)執(zhí)行的死讹。
  • 一個符號的值可以是LISP中的任意表達(dá)式,如一個符號曲梗、一個數(shù)字赞警、一個列表或者一個字符串。幼稚的一個符號被稱為一個變量虏两。
  • 一個符號可以同時具有一個函數(shù)定義和一個值愧旦。

LISP風(fēng)格“Hello World"

讓REPL打印“Hello World”再簡單不過。

CL-USER> "hello world"
"hello world"

其工作原理是碘举,因為字符串和數(shù)字一樣忘瓦,帶有LISP讀取器可以理解的字面語法并且是自求值對象;LISP讀取雙引號里的字符串引颈,求值的時候在內(nèi)存里簡歷一個可以對自身求值的字符串對象,然后再以相同的語法打印出來境蜕。雙引號本身不是在內(nèi)存中的字符串對象的一部分——它們只是語法蝙场,用來告訴讀取器讀入一個字符串。而打印器之所以在打印字符串時帶上它們粱年,則是因為其試圖以奕宗讀取器可以理解的相同語法來打印對象售滤。

函數(shù)

函數(shù)是LISP的基本程序構(gòu)造單元,可以用類似下面的defun表達(dá)式來定義:

CL-USER> (defun hello-world () (format t "hello world"))
HELLO-WORLD

defun后面的hello-world是這個函數(shù)的名字台诗。像hello-world這種用連字符而不是下劃線或是內(nèi)部大寫來形成復(fù)合詞的方法完箩,是標(biāo)準(zhǔn)的LISP風(fēng)格
表面上看拉队,這個表達(dá)式和你目前見到的所有其他表達(dá)式一樣弊知,只是另一個被REPL讀取、求值和打印的表達(dá)式粱快。這里返回值是你所定義的函數(shù)名秩彤。但是和format表達(dá)式一樣,這個表達(dá)式的副作用比返回值更有用事哭。但與format表達(dá)式所不同的是漫雷,它的副作用是不可見的:當(dāng)這個表達(dá)式被求值時,一個不帶參數(shù)且函數(shù)體為(format t "hello world")的新函數(shù)會被創(chuàng)建出來并被命名為HELLO-WORLD鳍咱。
一旦定義了這個函數(shù)降盹,你就可以像這樣來調(diào)用它:

CL-USER> (hello-world)
hello world
NIL

保存工作結(jié)果

在Emacs中可以通過輸入C-x C-f來創(chuàng)建一個新文件,然后根據(jù)Emacs的提示輸入文件的名字谤辜。文件存放的位置并不重要蓄坏。Common Lisp源文件習(xí)慣上帶有.lisp擴(kuò)展名仅胞,盡管有些人用.cl來代替。

一旦創(chuàng)建了文件剑辫,就可以向其中寫入之前在REPL里面輸入過的定義干旧。需要注意的是,在輸入了開括號和defun以后妹蔽,在Emacs窗口的底端椎眯,slime將會提示它所期待的參數(shù)。**具體形式取決于具體Common Lisp實現(xiàn)胳岂,但其形式可能如下所示编整。

(defun name varlist &rest body)

在文件中輸入以下內(nèi)容:

(defun hello-world ()
    (format t "hello world"))

可用集中方式將這個定義輸入到LISP環(huán)境中,最簡單的是當(dāng)光標(biāo)位于defun定義內(nèi)部的任何位置時乳丰,輸入C-c C-c掌测,這將啟動slime-compile-defun命令,將當(dāng)前定義發(fā)給LISP進(jìn)行求值并編譯产园。

輸入C-c C-z切換到REPL中可以嘗試調(diào)用新函數(shù)汞斧。

CL-USER> (hello-world)
hello world
NIL

輸入C-x C-s可以啟動Emacs命令save-buffer

嘗試從源文件加載這個函數(shù)什燕,著需要退出并重啟LISP環(huán)境粘勒。

執(zhí)行退出操作可以使用一個slime快捷鍵:在REPL中輸入一個逗號。然后在Emacs窗口底部將提示你輸入命令屎即,輸入quit庙睡,然后按回車。這將退出LISP并且關(guān)閉所有slime創(chuàng)建的緩沖區(qū)技俐。

現(xiàn)在重啟slime乘陪,使用M-x slime
這里有幾種方式讓LISP知道hello-world的定義雕擂。

  • 使用C-x b,在其提示時輸入hello.lisp以切換回含有那個文件的緩沖區(qū)啡邑,然后像之前那樣重新編譯定義。
  • 加載整個文件捂刺。
CL-USER> (load "hello.lisp")
T
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谣拣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子族展,更是在濱河造成了極大的恐慌森缠,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仪缸,死亡現(xiàn)場離奇詭異贵涵,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門宾茂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓷马,“玉大人,你說我怎么就攤上這事跨晴∨菲福” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵端盆,是天一觀的道長怀骤。 經(jīng)常有香客問我,道長焕妙,這世上最難降的妖魔是什么蒋伦? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮焚鹊,結(jié)果婚禮上痕届,老公的妹妹穿的比我還像新娘。我一直安慰自己末患,他們只是感情好研叫,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著阻塑,像睡著了一般蓝撇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上陈莽,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機(jī)與錄音虽抄,去河邊找鬼走搁。 笑死,一個胖子當(dāng)著我的面吹牛迈窟,可吹牛的內(nèi)容都是我干的私植。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼车酣,長吁一口氣:“原來是場噩夢啊……” “哼曲稼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起湖员,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤贫悄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后娘摔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窄坦,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鸭津。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彤侍。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖逆趋,靈堂內(nèi)的尸體忽然破棺而出盏阶,到底是詐尸還是另有隱情,我是刑警寧澤闻书,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布名斟,位于F島的核電站,受9級特大地震影響惠窄,放射性物質(zhì)發(fā)生泄漏蒸眠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一杆融、第九天 我趴在偏房一處隱蔽的房頂上張望楞卡。 院中可真熱鬧,春花似錦脾歇、人聲如沸蒋腮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽池摧。三九已至,卻和暖如春激况,著一層夾襖步出監(jiān)牢的瞬間作彤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工乌逐, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留做瞪,地道東北人梭冠。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓迎献,卻偏偏與公主長得像只嚣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子洛波,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 第一部分Common Lisp介紹第1章 介紹一下Lisp你在學(xué)的時候覺得已經(jīng)明白了胰舆,寫的時候更加確信了解了,教別...
    geoeee閱讀 2,927評論 5 8
  • 第三章 EVAL標(biāo)記法 3.1 導(dǎo)引 在進(jìn)一步深入學(xué)習(xí)Lisp之前蹬挤,我們必須切換到一個更加適合的標(biāo)記法缚窿,EVAL標(biāo)...
    geoeee閱讀 2,378評論 0 5
  • 3.4 說說相等和內(nèi)部表示 在Lisp中主要有5種相等斷言,因為不是所有的對象被創(chuàng)建的時候都是相等意義上的相等闻伶。數(shù)...
    geoeee閱讀 1,802評論 0 6
  • From:http://emacsist.com/10845 點 這里 查看更多 Emacs 相關(guān)推薦文章 或 最...
    海神之奏閱讀 5,452評論 0 26
  • 說明 函數(shù)式編程和面向?qū)ο缶幊炭梢哉f是編程的兩大宗教滨攻,猶如編輯器之爭一樣够话,之間口角不斷。我雖然靠著OOP的主力語言...
    lingyv閱讀 1,679評論 1 14