LISP (2) 第三章 函數

3.1 defun特殊表
定義一個函數,在defun後面最多有下列五個部分
符號名,這是函數定義要依附的符號
參量列表。如果滑,那它就是一個空列表()
描述文檔。可選部分,推薦要有. //當鍵入 C-h f 時看到的東西。
一個可使函數成爲交互函數的表達式,可選。可以通過M-x和函數名來使用。
函數體
模板描述:
(defun function-name (arguments...)
"optional-documentation..."
(interactive argumnet-passing-info)
body...)
一個不是交互式的函數定義的例子:
(defun multiply-by-seven (number)
"Multiply NUMBER by seven."
(* 7 number))
3.2 安裝函數定義
在上面函數定義的最外層右括號後面,C-x C-e, 此時回顯函數名。
也表示函數被安裝到Emacs裏了。
此時,C-h f 輸入函數名,就可以查到函數的註釋了。
調用函數:
(multiply-by-seven 3)
在右括號後面 C-j 就可以看來結果 21了。
改變函數定義
在函數定義的地方重新寫上定義體,然後對函數求值即可。
3.3 使函數成爲交互函數
例子:
(defun multiply-by-seven (number)
"Multiply NUMBER by serven."
(interactive "p") ;告訴Emacs 要先傳遞一個前綴參量給此函數
(message "The result is %d" (* 7 number)))
在對函數求值後,就可以使用了。
使用:C-u 3 M-x multiply-by-seven
結果: The result is 21
註釋: 前面的C-u 3 是指爲要調要的函數輸入參數。
也可以用 M-3 來輸入這個前綴變量。
關於message 函數,有簡單的使用,和C的printf有點像,比如 %d, %s, %c等。
3.4 interactive函數的不同選項
略,書上太略了。還沒看懂。
3.5 永久安裝代碼
簡單的說,就是把函數定義寫到文件裏,讓Emacs啓動時,自動讀取它。
方法如下幾種:
1. 寫入.emacs文件裏,這個文件啓動時,自動對文件內的所有函數求值。
2. 把函數定義寫在其他文件內,再用load 函數去調用它們,來達到安裝效果。
3. 如果此函數將被所有用戶使用(*nix環境),應該寫到site-init.el文件內,Emacs會自動安裝。
3.6 let 函數
let 表達式是一個特殊的表。
主要是用來定義函數體內部的局部變量時使用,這樣避免不同函數的同名變量衝突。
可以一次對多個變量賦值,或者賦nil
3.6.1 let 表達式的各個部分
有三個部分組成
第一部分, 就是let 符號
第二部分,是一個列表,稱爲變量列表,元素就是一個{1,2}的列表。
即當此元素是一個符號, 或者是一個“符號-值”。
第三部分,是let表達式的主體,可能有一個或多個列表組成。
(let varlist body...)
關於第二部分變量列表的例子:(thread (needles 3))
則let 執行完後,thread被賦nil , needles被賦3
3.6.2 let 表達式例子
(let ((zebra 'stripes) (tiger 'fierce))
(message "One kind of animal has %s and another is %s."
zebra tiger))
執行上面的let函數,效果有兩個,一是對zebra , tiger 進行賦值。
二是message函數的結果,將作爲let 函數
的返回值,或者叫附帶效果。
3.6.3 let 語句中的未初始化變量
如3.6.1 , 未初始化的變量 ,被給值nil。至於類型,可能是%c, %s, %d, 都會正常出力爲nil

3.7 if 特殊表
這是一個比較簡單的表, 看例子先(if (> 5 4) (message "5 is greater than 4!"))
說明: if 列表分三部分, 如果第二部分 的表達式成立的話,就執行第三部分。
看一個具體一點的例子:
(defun type-of-animal (characteristic)
"Print message in echo area depending on CHARACTERISTIC.
If the CHARACTERISTIC is the symbol 'fierce',
then warn of a tiger."
(if (equal characteristic 'fierce)
(message "It's a tiger!")))
本身很簡單,注意這裏一個新的函數, equal, 用於判斷後面的兩個元素是否相等。
3.8 if-then-else表達式
略過,比起上面,多了一個部分。用來表示ELSE的執行部。
3.9 LISP的真與假
nil 以外的東西都是真。
nil表示沒有,同時,空列表()也是nil
3.10 save-excursion 函數
先說兩個概念,
光標point: 光標所在的位置,以一個整數來表示,BUFFER最開始是1
標記mark:C-spc 時,作了一個MARK,那時的點,叫做MARK點,C-x C-x 可以在
point 和mark之間輪換。
上面兩點之間的緩衝區叫做現域region, 有很多針對域的函數
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章