LISP (2) 第三章 函数

来源:互联网 发布:交换机端口亮黄灯 编辑:程序博客网 时间:2024/04/29 19:35
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, 有很多针对域的函数
原创粉丝点击