这部分来学习下if特殊表,之前学了defun和let,不好意思,博客中没有写但是鄙人已经看了,哈哈。
什么是if表
if条件特殊表是为了让计算机对条件加以判断,然后选择不同的执行路径的。
if特殊表的含义是:如果一个测试是正确的,则对后续的表达式求值;
如果这个测试不正确,则不对表达式求值。
在Lisp中的if表达式并没有then这样的字眼,但是,测试和执行代码必然就是第一个元素为if的这个列表的第二和第三个元素。
但是,测试部分通常称为"if部",而第二个参数常被称为"then部"。
P. S. 是我眼花了了,博客园的代码显示居然没有Lisp的,哼!
下面给出一个简单的例子
if表达式的测试部分并是必须示例中的一样,而是可以很丰富的。
如果执行下面的一个求值的话,给出的值是nil。
type-of-animal函数详解
type-of-animal函数是根据两个模板写成的,一个模板是函数定义模板,另一个模板则是if表达式模板。
而if表达式中有一个测试表达式,又有一个执行表达式。
if-then-else表达式
if表达式可以有第三个参量,称为else部。这个是为了测试为假的时候执行的。
"else"这个词并不写在Lisp代码中,if表达式的else部紧接在then部的后面。
在Lisp中,else部经常在一个新行中书写,而且缩进得比then部少。
下面给出一个示例
然后对type-of-animal进行改造,如下图所示
是不是很好玩!!!
Lisp中的真与假
只要是nil都是假,其他的都为真,跟C还有点像嘞,C中是非0都是真,只有0为假。
如果真假测试返回的结果是一个数字(如47)、一个字符串(如"hello")、一个符号(除nil外,如flowers)、一个列表,
甚至一个缓冲区时,测试结果为"真"。
nil在Lisp中有两层含义:一个是表示空列表;另一个表示"假",并且是真假测试时假的返回值。
可以将nil写作()或者nil。只要是Lisp解释器,()和nil都是假,但是对于人的话,喜欢用nil代表假,()代表空列表。
但是对于以下例子,我感到有点奇怪
但是还有其他的例子
如果测试结果为真,但是又无法使用那些适当的值时,Lisp解释器将会返回符号t作为真,可以对一下表达式求值
save-excursion函数
save-excursion函数是第四个特殊表(前三个是defun,let,if??)。
这个函数可以将当前的位点和标记保存起来,执行函数体,然后如果位点和标记发生改变就将位点和标记恢复成原来的值。
没看明白上面这句话说得是啥??
位点(point):光标所处的当前位置,不管光标在什么地方,那里就是位点。
光标在终端上显示在什么字符上,位点就在这个字符前面,在Emacs Lisp中,位点就是一个整数。
缓冲区的第一个字符对应数字1,第二个字符对应数字2。
point函数返回光标当前的位置,其值是一个数,每一个缓冲区都有自己的位点。
标记(mark):是缓冲区中的另外一个位置,它的值可以用于给命令来设置。
如果设置了一个标记,可以用命令C-x C-x是光标从位点跳到标记处,并将光标当初所在的位置设置成一个标记。
另外,如果设置了另一个标记,原来的标记的位置就被保存在标记环中,用这个方法可以保存多个标记位置。
可以一次或者多次键入C-u C-SPC命令来使光标跳到被保存的标记处。
位点和标记之间的缓冲区被称作现域(region)。
许多命令是对域操作的。
save-excursion特殊表将位点和标记的当前位置保存起来,并当特殊表主体代码由Lisp解释器执行完毕之后恢复原来的位点和标记。
还是不知道要干啥!
使用save-excursion特殊表的代码模板如下:
或者详细一点的:
Emacs中,save-excursion表达式经常出现在一个let表达式主体中。
可惜这里没有示例演示效果。。。哎