1 语言概念
- 主要用来写 Emacs 软件的 Lisp
- Lisp 的意思是 List Processing
2 List 列表
2.1 list 概念
- list 是 lisp 的基础
- list 是由()包括的用空白字符分隔的原子,内部 list,或者原子和内部 list 的混合元素组成的,例如:’(rose daisy buttercup), ‘(+ 2 2), ‘(this list has (a list inside of it))
- list 里面可以只包括一个原子,或者什么也没有
- () 空列表,可以同时表示一个原子或者一个列表
2.2 符号表达式
- 由原子和 list 组成的这种输出形式被称为符号表达式或者 s-expressions
2.3 Atom 原子
- 不可分割的单个单词,数字,符号,双引号括起来的字符串都称为原子
2.4 list 中()前有’和没有’的区别
- ‘(+ 2 2):会告诉 lisp 解释器,除了按照所写的来返回展示,什么也不执行
- (+ 2 2):会告诉 lisp 解释器+是一条指令,会用后面剩余的原子来执行这个指令,在 lisp 中,类似+所代表的一组指令,叫做 functions
2.5 符号名称和函数定义
- A symbol,类似+符号一样,本身不是计算机可执行的指令,但是可以暂时代表一组计算机执行指令。在 lisp 中一组指令可以用多个名字来表示,例如 :加法指令可以同时用或者 plus 来表示;但是,a symbol 在同一时间只能表示唯一的一组指令(也叫一个 function)
- 因为 Emacs lisp 是非常庞大的,所以 symbol 的命名方式表示这个 function 属于的是哪一种功能部分的,例如 rmail-表示用来读 mail,text-表示用来处理 text 文本信息的
2.6 lisp 解释器
- lisp 解释器主要做的两件事情:
- 1.’()类似这样带’的 list,解释器直接返回 list
- 2.()类似这样不带’的 list,解释器会找 list 中的第一个原子,看是否有其表示的 function 定义,如果有,则执行指令,如果没有则显示出 error message
- lisp 解释器能解决的问题:
-
- 计算那些没有’开头的和没有()包括的 symbol
-
- 替换一些表达式为另外的一些原始定义的表达式,例如将宏(mocro)替换为原始表达式
-
- 优先处理内部嵌套的 list,如果没有内嵌的 list,则按照从左到右的顺序处理 list
-
- 执行字节码编译:通过执行 byte-compile-file 命令可以将.el 结尾的 lisp 文件进行字节码编译,生成.elc 文件
-
2.7 变量
-
- a symbol 能像关联一个函数定义一样关联到一个 value,例如:可关联到数字,字符串,列表等,这样有 value 值的 symbol 通常叫做变量
-
- a symbol 能同时是一个变量,和关联到一个函数定义,这两者是相互没有关联的,不会互相影响
2.8 参数
-
- 传递给函数的参数类型,取决于函数所使用的数据类型
-
- 参数可以是变量的值,或者列表,例如:
(concat "The " (number-to-string (+ 2 fill-column)) "red fixed.")
其中:
fill-column 在执行时回将其返回的变量值作为参数传递给+代表的 function
(number-to-string (+ 2 fill-column)) 在执行时会将此列表返回的值作为参数传递给 concat
-
- message 函数
(message "He saw %d %s"
(- 30 fill-column)
(concat "red "
(substring "foxed foxes foxing" 6,11)
" leaping"))
2.9 赋值
1.set的用法
(set 'flower '(rose violet)) 其中第一个参数和第二个参数都需要将 ‘ 放在前面,如果第一个参数flower没有引号,则lisp解释器会最先将flower变量求值后返回,而这个时候flower变量还没有被赋值,所以lisp解释会抛出一个错误;第二个参数需要带 "'" 的原因是:带上 "'" 的list会直接返回list(参见2.4),然后传递给set函数将flower赋值。 flower变量此时执行C-x C-e会显示出(rose violet)
2.setq的用法
(setq flower '(rose violet)) 相当于 (set 'flower '(rose violet)) setq中的 q 表示的意思是:set函数的第一个参数自动会加上 '
待续更新中。。。