通过前面的几节内容我们已经对elisp
中基本类型有所了解了。emacs lisp 简明教程 中下一节开始就是讲相关容器。所以这一篇我将它作为基础类型的一个结尾,将平时会用到,但是之前没有涉及到的内容都包含进来。
bool类型
本篇首先要提到的就是bool类型,我们已经在前面几章中用到过它,但是没有具体提到它。像if
,cond
、while
中都有它的声影。有其他编程语言相关经验的读者对它应该不会陌生,而且使用起来应该也是手到擒来。
elisp中bool变量的真和假分别用 t
和 nil
来表示。它只有 nil
表示假,其余都是真。在其他编程语言中,0表示假,但是elisp中0也是真,我们可以使用下列代码来验证
(if 0(message "0 is t")(message "0 is nil")) ;; ⇒ "0 is t"
包括0、空字符串都是真,elisp中只有 nil
本身是假,其余都是真。
与其他编程语言类似,bool变量主要使用逻辑运算符来进行运算。elisp中的逻辑运算符也是与或非,对应的操作符为 and
、or
、not
,它们中间也有短路性质,即and
语句中如果一条语句已经为假,则不执行后一条,而or
中一条语句为真,则不判断后一条语句。elisp中经常利用短路性质来执行一些特殊的操作,例如常常用 or
来设置函数参数的缺省值。例如
(defun say-hello (&optional name)(or name (setq name "Emacs"))(message "Hello, %s" name))(say-hello) ;; ⇒ "Hello, Emacs"
(say-hello "Lisp") ;; ⇒ "Hello, Lisp"
位运算
当初在学习C、C++
的时候就觉得它对二进制位的操作实在是比较精妙,例如TCP/IP协议中使用位域来定义相关结构体。或者Win32 API中关于flag的设计就是典型的位运算设计。利用位运算的相关内容,一个字节的数据就能存储8位的标志。虽然教程中没有提及位运算的内容,但是我实在是比较好奇elisp中的位运算,所以我加了这一部分的内容。
内容也比较简单,位运算基本也就是那些操作,主要是 and
、or
、xor
、not
。以及左移右移的操作。
elisp中提供了支持这些操作的一些函数,下面是一些位的逻辑运算的函数
- logand: 按位与运算
- logior: 按位或
- logxor: 按位异或
- lognot: 按位非
;; 3 ⇒ 011 5⇒ 101
(logand 3 5) ;; ⇒ 1
(logior 3 5) ;; ⇒ 7
(logxor 3 5) ;; ⇒ 6
(lognot 5) ;; ⇒ -6
下面是位移运算的函数
- ash: 位移操作
elisp 中没有单独提供左移和右移的操作,上面的函数根据第二个参数来决定左移或者右移,正数代表左移,负数代表右移,例如
(ash 3 1) ;; ⇒ 6
(ash 3 -1) ;; ⇒ 2
本节到此就结束了。本节算是一个针对原来教程的补充,内容不多。