Emacs Lisp 基础
Table of Contents
练习 elisp 的方式:在 *scratch*
buffer 中练习,有几种方式执行:
C-j
M-C-x
C-x C-e
1. 数据结构
1.1. 注释
分号 ;
表示注释。
(fset 'yes-or-no-p 'y-or-n-p) ; y/n replace yes/no
1.2. 字符串
只允许使用双引号,多行直接换行即可。
1.3. 字符
?x
表示字符 x
,比如 ?a
表示 ASII 97 a
。
字符实际上会被转成 ASII 值,所以你可以使用 ?a
到 ?z
迭代。
1.4. 数字
- int 是 29 位,不是 32 位
- 二进制以
#b
开始,比如#b10010110
- 八进制格式为
#o[0-7]
比如#o377
- 十六进制以
#x
开始,比如#xABCD
- 浮点数,比如
0.0
3.1415926
(64 位精度) - 科学记数法
6.02e23
变量 most-positive-fixnum
和 most-negative-fixnum
表示最大和最小数字。
1.5. 布尔
小写的 t
表示 true, nil
表示 false。
在 elisp 中,只有 nil
表示 false 值。其它的值在布尔上下文中都算作 true,包括空字符串,0,和符号 'false
,和空的 vector。
空列表 '()
和 nil
相同。
1.6. 数组
具有固定大小的数组叫做 "vectors",你可以使用方括号来初始化一个 vector,比如:
[1, 2, 3, 4, 5, 6] ["hello", "world"] ["hi", 1, 2, 3 [4 "a"]]
注意不是逗号分隔元素,而是空格。
Vector 可以混合类型,而且可以内嵌。你可以使用 make-vector
来创建它们,而且每一个 vector 都是单例。
1.7. 列表
lisp 中大量的使用了链表。括号中的任何内容都是列表,但除非引用它,否则会被认为是函数调用。有多种引用列表的方式:
(quote (1 2 3)) '(1 2 3) ; 是 quote 的简写 (list 1 (+ 1 1) 3) ; 也生成 (1 2 3) ,但首先会对元素进行计算 `(1 ,(+ 1 1) 3) ; 通过称为 "反引号" 的模板系统创建 (1 2 3)
1.8. Pairs
两个元素的结构,语法是 (head-value . tail-value)
,你必须要引用它。
经常用作查询表结果数据的关联列表,称为 alist
。是一个点对的列表,类似这样:
'( (apple . "red") (banana . "yellow") (orange . "orange") )