一、参考
Emacs Lisp 简明教程
二、scratch缓存区
进入scratch
缓存区,
模式选择 lisp-interaction-mode
(注: 可以通过 m-x lisp-interaction-mode ret
切换模式)
三、小试牛刀
3.1 hello world
(message "hello world")
3.2 两个执行命令
(1) c-x c-e
执行lisp代码的命令为 c-x c-e
, 即函数 eval-last-sexp
函数解释如下:
执行光标之前的表达式
(2) c-j
,即函数 val-print-last-sexp
函数解释如下:
执行光标之前的表达式,和c-x c-e
的不同之处是,执行结果不仅在底部的mini buffer
中输出,而且在 current buffer
中也会显示
注意: 一次只会解释执行一个表达式
四、函数
4.1 函数定义
函数由3个部分组成,
(1)函数名称
(2)函数参数列表
(3)函数体
函数体和函数定义之间,可以通过"doc string"
添加函数文档
4.2 函数执行
4.3 注意
注意,
(1) 如果需要执行新定义的函数 hello-world
,需要先在函数定义结尾,执行c-x c-e
解析执行该新函数,否则会报错
Debugger entered--Lisp error: (void-function hello-world)
(2) 当执行过函数定义后,光标在函数名时候,通过命令 c-h f
可以查看该函数的文档
五、变量
5.1 setq
可以通过 c-h v
查看变量的文档
5.2 defvar
defvar
声明变量,如果声明的变量已经存在,则不会改变原值
由于lisp
中的函数都是全局的,导致setq
定义的变量也容易变为全局变量,
如果想要查看变量是否已经存在,可以通过c-h v
查看是否已经定义
5.3 let
lisp
中可以使用 let
指定局部作用域的变量
这时候,局部变量 pi
, area
定义在函数 circle-area
中,通过c-h v
无法查看变量
5.4 let*
let*
和 let
的使用方式相同,唯一区别是:
let*
中可以使用之前定义的局部变量
六、lambda
表达式
6.1 定义时候直接调用
6.2 lambda
表达式赋值为变量
七、控制结构
7.1 顺序执行
7.2 条件判断 if
7.3 条件判断 cond
7.4 循环 while
7.5 逻辑运算