这部分来学习下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表达式主体中。

可惜这里没有示例演示效果。。。哎

第3章 如何编写函数定义 3.7 if特殊表的更多相关文章

  1. Python基础教程-第一章-变量、函数、字符串

    1.1变量 变量基本上就是代表(或者引用)某个值的名字,举例来说,如果希望用x代表3,只需要执行下面的语句即可: >>>x = 3 这样的操作称为赋值(assignment),值3赋 ...

  2. Oracle编程入门经典 第11章 过程、函数和程序包

    目录 11.1          优势和利益... 1 11.2          过程... 1 11.2.1       语法... 2 11.2.2       建立或者替换... 2 11.2 ...

  3. Python之编写函数

    Python之编写函数 在Python中,定义一个函数要使用 def 语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用 return 语句返回. 我们以自定 ...

  4. [Effective JavaScript 笔记]第3章:使用函数--个人总结

    前言 这一章把平时会用到,但不会深究的知识点,分开细化地讲解了.里面很多内容在高3等基础内容里,也有很多讲到.但由于本身书籍的篇幅较大,很容易忽视对应的小知识点.这章里的许多小提示都很有帮助,特别是在 ...

  5. 教你看懂C++类库函数定义之三---_stdcall

    一切从一个C++ 类库头文件开始,现在在做一个C++的项目,期间用到一个开源的界面库DUILib(类似MFC),这个东西还不错能很容易的写出漂亮的界面,比如QQ的界面,可以去下载下来研究研究,地址:h ...

  6. Effective C++ Item 46 当需要投你非成员函数定义模板

    本文senlie原版的,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:当我们编写一个 class template, 而它所提供之"与此 temp ...

  7. 快学Scala-第二章 控制结构和函数

    知识点: 1.条件表达式 if(x>0) 1 else 0 scala每个表达式都有一个类型,如果一致则为它们的类型,如果为混合类型表达式,则为它们的公共超类型Any. if(x>0) 1 ...

  8. 9 - Python函数定义-位置参数-返回值

    目录 1 函数介绍 1.1 为什么要使用函数 1.2 Python中的函数 2 函数的基本使用 3 函数的参数 3.1 参数的默认值 3.2 可变参数 3.2.1 可变位置传参 3.2.2 可变关键字 ...

  9. Python 函数定义和使用

    # 函数的概念 # 概念 # 写了一段代码实现了某个小功能; 然后把这些代码集中到一块, 起一个名字; 下一次就可以根据这个名字再次使用这个代码块, 这就是函数 # 作用 # 方便代码的重用 # 分解 ...

随机推荐

  1. 1424 零树 (树形DP)

    1424 零树 题意 给出一棵树,每次可以选择一个包含节点 1 的连通块,将所有的节点的权值同时加 1 或减 1 ,问最少多少次操作使所有节点权值变为 0 . 分析 这种题意简单的题目好处就是能很快知 ...

  2. poj2728(最小比率生成树)

    poj2728 题意 给出 n 个点的坐标和它的高度,求一颗生成树使得树上所连边的两点高度差之和除以距离之和最小. 分析 01分数规划+最小生成树. 对于所有的边,在求最小生成树过程中有选或不选的问题 ...

  3. ubuntu安装KVM

    1. vmware安装ubuntu-14.04.1-server-amd64.iso.2. 安装完成后关机--右键虚拟机--setting--hardware--Processors--将 virtu ...

  4. UBIFS分区制作及UBIFS烧写和启动

    参考 http://blog.csdn.net/chongzi865458/article/details/6799258 ubiattach version 1.0 - a tool to atta ...

  5. 一个小时内学习SQLite数据库

    一个小时内学习SQLite数据库 2012-05-11 10:24 红薯 OSCHINA 字号:T | T SQLite 是一个开源的嵌入式关系数据库,实现自包容.零配置.支持事务的SQL数据库引擎. ...

  6. DirectoryServicesCOMException

    捕捉到 System.DirectoryServices.DirectoryServicesCOMException Message=该服务器不愿意处理该请求. Source=System.Direc ...

  7. JAVA常见算法题(一)

    package com.xiaowu.demo; // 有一只兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第四个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多少? /** * ...

  8. Scala各种符号含义;scala =>符号含义总结

    符号: <- :for循环 -> :map映射 => :匿名函数 Int= :scala函数 _ :通配符 https://blog.csdn.net/bon_mot/article ...

  9. window coordinate

    到ndc的转换是通过(x/w,y/w,z/w) 到了  window coordinates dx upper left gl lower left setviewport setscissor rt ...

  10. jstl fn:replace替换换行符

    textarea输入换行符后应该是'\n',在div中展示时替换成'<br>' 找到一种方法用jsp标签 jstl fn:replace方法 使用fn:replace方法之前 先要把jst ...