本基本介紹翻譯自 Emacs 高手 Xah Lee 的介紹文章,予以中文化!
關於如何求值 elisp,請見昨天的文章。
一:顯示訊息
; printing
(message "hi")
; printing variable values
(message "Her age is: %d" 16) ; %d is for number
(message "Her name is: %s" "Vicky") ; %s is for string
(message "My list is: %S" (list 8 2 3)) ; %S is for any lisp expression
輸出會到名叫 *Messages* 的緩衝區,或用快捷 F1-e (view-echo-area-messages) 調用
進階參考:Emacs Lisp's print, princ, prin1, format, message.
二:計算
(+ 4 5 1) ; ⇒ 10
(- 9 2) ; ⇒ 7
(- 9 2 3) ; ⇒ 4
(* 2 3) ; ⇒ 6
(* 2 3 2) ; ⇒ 12
(/ 7 2) ; ⇒ 3 (Integer part of quotient)
(/ 7 2.0) ; ⇒ 3.5
; 要使輸出爲帶小數點,必須用 .0 接在整數後面
(% 7 4) ; ⇒ 3 (Remainder)
(expt 2 3) ; ⇒ 8
;; 判斷函數,可以決定是否爲某表示式
(integerp 3.) ; returns t
(floatp 3.) ; returns nil
(floatp 3.0) ; returns t
在 elisp 中,以 p 結尾的函數名,通常回回傳 true 或 false (p 是 predicate)
而 elisp 的 t 表示 true, nil means false
三:轉換數字於字串:
(string-to-number "3")
(number-to-string 3)
詳情可看
(info "(elisp) Numbers")
四:判斷:
在 elisp 中,nil / list () (空表) 代表 false,其他的任何符號則都代表 true。
; 底下都是 nil 的其他寫法
(if nil "yes" "no") ; ⇒ "no"
(if () "yes" "no") ; ⇒ "no"
(if '() "yes" "no") ; ⇒ "no"
(if (list) "yes" "no") ; ⇒ "no", 因 (list)、() 均是空表
;; true 可用 t 作爲簡寫
(if t "yes" "no") ; ⇒ "yes"
(if 0 "yes" "no") ; ⇒ "yes"
(if "" "yes" "no") ; ⇒ "yes"
(if [] "yes" "no") ; ⇒ "yes". [] 爲空表
(and t nil) ; ⇒ nil
(or t nil) ; ⇒ t
五:比較結構:
(< 3 4) ; less than
(> 3 4) ; greater than
(<= 3 4) ; less or equal to
(>= 3 4) ; greater or equal to
(= 3 3) ; ⇒ t
(= 3 3.0) ; ⇒ t
(/= 3 4) ; not equal. ⇒ t
;; 字串的比較
(string-equal "this" "this") ; ⇒ t. Case matters.
;; 若要資料結構(datatype)跟值(value)均相同的,需用 equal
(equal "abc" "abc") ; ⇒ t
(equal 3 3) ; ⇒ t
(equal 3.0 3.0) ; ⇒ t
(equal 3 3.0) ; ⇒ nil. 資料結構不對
;; 表異同的比較
(equal '(3 4 5) '(3 4 5)) ; ⇒ t
(equal '(3 4 5) '(3 4 "5")) ; ⇒ nil
;; 測試符號的異同
(equal 'abc 'abc) ; ⇒ t
若要使用 not 的功能,/= 是給數字的,其他東西請用 (not (equal A B)) 爲宜
(not (= 3 4)) ; ⇒ t
(/= 3 4) ; ⇒ t. “/=” is for comparing numbers only
(not (equal 3 4)) ; ⇒ t. General way to test inequality.
詳情可看:
(info "(elisp) Comparison of Numbers")
(info "(elisp) Equality Predicates")
六:全域、局域變數
setq 是用來設定(全域)變數用的函數。
(setq x 1) ; assign 1 to x
(setq a 3 b 2 c 7) ; assign 3 to a, 2 to b, 7 to c
欲設定局部變數,使用 let。格式是:(let (‹var1› ‹var2› …) ‹body›) ,‹body› 是一個(或多個) elisp 表達式。表達式中最後一個函數的值將會被作爲結果返回爲整個 let 的結果。
(let (a b)
(setq a 3)
(setq b 4)
(+ a b)
) ; returns 7
;; 其他的形式可以是 (let ((‹var1› ‹val1›) (‹var2› ‹val2›) …) ‹body›)
(let ((a 3) (b 4))
(+ a b)
) ; returns 7
詳情可看:
(info "(elisp) Variables")