iT邦幫忙

DAY 9
1

EMACS 新思維系列 第 9

[EMACS新思維 第十二天] Elisp 入門(二): elisp 語法入門 (一)

本基本介紹翻譯自 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")


上一篇
[EMACS新思維 第十一天] Elisp 入門(一):執行 elisp 程式碼
下一篇
[EMACS新思維 第十三天] Elisp 入門(三): elisp 語法入門 (二)
系列文
EMACS 新思維27

尚未有邦友留言

立即登入留言