最新消息:XAMPP默认安装之后是很不安全的,我们只需要点击左方菜单的 "安全"选项,按照向导操作即可完成安全设置。

Emacs Lisp 簡介 – 1

XAMPP下载 admin 642浏览 0评论
 Emacs Lisp
Emacs 既然使用 Emacs Lisp 來擴展他的功能,我們當然需要稍微了解一下這個獨特的語言,篇幅關係無法很全面介紹這個程式語言,但希望能涵蓋到重要的概念
Emacs Lisp 是一個直譯式的程式語言,如同 Python, Javascript 般,但它的語法相當獨特,是 Lisp 底下的一種方言,Lisp (List Programming) 顧名思義,是使用 List 來寫程式,跟我們大部分理解的程式語言架構相當不同,但是基本觀念還是相通,例如變數,函數,迴圈,流程控制…
至於 Lisp 相關的 Object-oriented 的部分,像是 Class 等等,我們這裡就不多談了
Hello World
學習語言的第一個練習就是經典的 “Hello World”,我們先看看如何用 Emacs Lisp 來印出這個訊息
Emacs Lisp 的語法是 (print “Hello World”),用小括號 () 產生一個 List,List 的第一個單元一定要是一個函數,例如 (1 2 3) 會產生 (invalid function 1) 的訊息,因為 1 不是函數
在 Emacs Lisp 裡,印出訊息有幾種方式
(print “Hello World”) 印出結果並返回結果
(message “Hello World”) 印出結果並加入 Message 緩衝區
(format “Hello %s” “World”) 類似 C 語言的 printf 可以加參數
要練習 Emacs Lisp 語言有幾種方式:
使用 Emacs 的 Scratch 緩衝區,打完程式後按 Ctrl-j,結果會直接出現在下面
QQ截图20181012164427
使用 ielm: Meta-x ielm
QQ截图20181012164434
直接開 .el 檔案,打完程式後按 Ctlr-x Ctrl-e 執行,結果會在小緩衝區中
QQ截图20181012164439
 每次的結果會出現兩次,第一次是因為程式要印出 “Hello World”,第二次是 elisp (emacs lisp 簡稱) 會自動返回 (return) 最後一個程式語句 (statement) 的結果
 清單(List)
使用 (list 1 2 3) 產生 (1 2 3) 的清單 (List),清單裡可以有各種類別,例如 (list ‘my (+ 1 1) “sons”) 產生 (my 2 “sons”)
使用 (quote (1 2 3)) 也會產生 (1 2 3) 的清單,這樣的語法因為常用,所以可以簡寫為 ‘(1 2 3)
兩者之不同在於 quote 只會不管三七二十一,將後面參數如實反應,但 list 會按照 elisp 的傳統先做參數的 evaluation,例如 (list 1 (+ 2 3) 4) 會產生 (1 5 4) 而 (quote (1 (+ 2 3) 4)) 則是 (1 (+ 2 3) 4)
利用 car 取清單的第一個元素,cdr 取清單的其餘元素,例如 (car ‘(1 2 3)) 會回 1,而 (cdr ‘(1 2 3)) 會回 (2 3)
有趣的是 car 跟 cdr 可以用在一起,例如 (cadr ‘(1 2 3)) 會產生 2,先計算 (cdr ‘(1 2 3)) 得到 (2 3) 再用 (car ‘(2 3)) 得到 2
變數
全域變數

使用 (defvar my/test1 “Hello World”) 來定義全域變數
也可以使用 (setq my/test2 “Hello World”) 來定義,但不可以用 (set my/test3 “Hello World”),因為當 elisp 求 my/test3 的值時會發生 void variable 變數未定義的錯誤,這時可以用 (set ‘my/test3 “Hello World”) 其實跟 (setq my/test3 “Hello World”) 是一樣的
那 defvar 跟 setq 有何不同,defvar 可以寫幫助文件,例如
(defvar my/test “Hello World”
“這是一個測試用的變數”)
當你用 Ctrl-h v 來看這個變數時,會同時有文件

QQ截图20181012164617
  • 至於區域變數的部分,留待再談函數時,再來解釋

為了不要讓文章太長,我們就此打住,接下來的函數及流程的部分,留待下一篇再來討論

转载请注明:XAMPP中文组官网 » Emacs Lisp 簡介 – 1

您必须 登录 才能发表评论!