iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 3
0
Software Development

Emacs 來寫程式系列 第 3

[Emacs-3] Emacs Lisp 簡介 - 1

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,結果會直接出現在下面 scratch
    • 使用 ielm: Meta-x ielm ielm
    • 直接開 .el 檔案,打完程式後按 Ctlr-x Ctrl-e 執行,結果會在小緩衝區中 Imgur
    • 每次的結果會出現兩次,第一次是因為程式要印出 "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)
  • 有趣的是 carcdr 可以用在一起,例如 (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") 是一樣的
    • defvarsetq 有何不同,defvar 可以寫幫助文件,例如
        (defvar my/test "Hello World"
            "這是一個測試用的變數")
    

    當你用 Ctrl-h v 來看這個變數時,會同時有文件 defvar

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

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

如果你想直接看影片跟著練習,歡迎收看 Yes

簡報的部分,請至 我的部落格


上一篇
[Emacs - 2] 基本使用及操作
下一篇
[Emacs-4] Emacs Lisp 簡介 - 2
系列文
Emacs 來寫程式30

尚未有邦友留言

立即登入留言