emacs lisp 语言基本概念

1. 列表
   用空格分开,以圆括号括起来的单词,数字或者其它列表,如(+ 1 2)或者包括子列表的列表(+ 1 (+ 2 3))。
列表是emacs lisp(简称elisp)的基础,所有的程序都是由列表组成的。在elisp里,数据和程序都是以同样的
方式表示。
2. 原子
   在elisp中不可再分为更小的部分的东西称为原子,比如数字,单词,字符串,elisp的原子种类比较少,一般用到
的也就这几种,列表由三种组成方式,由原子组成,由列表组成,由原子和列表组成,没有任何原子的列表()称为空
列表,它比较特殊,即是原子又是列表。
3. 符号表达式(symbolic expression)
   原子和列表的书面表示都被称为符号表达式。在elisp的列表中的空格数量可以任意,所以我们可以使用空格来排版
列表使我们易于阅读
4. 表达式求值
   表达式求值遵循下面简单的规则
   - 对数字求值就是它本身
   - 对双引号括起来的字符串求值就是它本身
   - 对一个符号求值将返回它的值
   - 对一个列表求值,从左往右扫描列表,查找绑定在第一个符号上的函数定义,执行该函数定义,列表剩下的全部符号
     作为该函数的参数,如果剩下的符号中还有列表,递归的使用本规则进行解析。
   - 单引号告诉elisp返回表达式的书面形式,而不是对它求值,如'test返回test本身,而不是test变量的值
   - 对一个函数求值总是返回一个值(除非返回一个错误信息),但是很多时候我们真正需要的其实是函数的附加效果,
     如(next-line)我们对返回值其实不关心,我们想要的是附加效果。在其他一些语言中需要返回值的叫做函数,需要
     附加效果的叫做过程。在elisp中我们不区分这两者
   - 特殊列表
     特殊列表是求值方式或者目的和前面的列表求值有差异的列表,其实总体来说就是其它语言中的语法规则,在第5节中
     介绍
5. 特殊列表
   - 给变量赋值
     用得最多的有四种
     - set
       语法为(set 'flowers '(rose lily)),将flowers绑定到列表(rose lily)上。
     - setq
       和set基本一样,除了第一个参数不用加单引号,elisp自动给你加上单引号,使用方法为(setq flowers '(rose lily)),
       效果和上面的set是一样的,但是使用setq可以同时对多个变量赋值,第一个参数绑定第二个参数,第三个绑定第四个,以此
       类推。如(setq flowers '(rose lily) trees '(oak maple))
     - let
       let其实是使变量本地化,这样在let范围以外看不到let里定义的变量,语法为
                               (let varlist body)
       其中第二个部分varlist为一个列表,表示变量定义,可以是单个原子,赋值为nil,也可以是一个两个部分组成的列表,表示
       第一个符号绑定在第二个符号求值后的结果上。第三部分为任意列表组成。
       这个和其它语言中称为语句块很相
   - 函数定义
     用于定义函数,语法如下
                        (defun function-name (arguments)
                          "optional documentation"
                          (interactive arguments-passing-info)
                            body)
     函数定义由五部分组成:
     - 符号名,这个函数定义要绑定的符号
     - 传送给函数的参数列表,可以为空列表,表示没有参数
     - 描述文档,是可选的,但是最好认真填写
     - 是一个函数成为交互函数的表达式,是可选的,没有是一个函数,有是一个命令。命令表示可以在emacs里使用M-x调用,或者
       绑定键以后使用按键调用
     - 函数定义的内容,该函数完成任务的代码。
     函数的安装,如果是单个函数的安装可以在函数的最后一个括号后C-x C-e安装
     对于一个文件的安装 M-x load-file RET filename RET 安装整个文件里的函数
     要想在每次启动emacs都自动安装,将函数定义放在.emacs里或者init.el里,这是最简单的方法,具体细节在以后再介绍
   - 控制结构
     - 条件控制
       条件控制的语法如下
         (if (condition)
            then-part
           else-part)
       if条件控制由三个部分组成:
       - 条件判断列表,对条件进行测试,返回值为nil或者其它代表t的值,elisp中只有空列表()或者nil表示假,其它所有的值都
         表示真。
       - then-part是一个列表,当条件为真时执行。如果要执行多个列表,使用progn特殊表将多个语句包起来一起执行
       - else-part是可选的,当条件为假时执行。和then-part一样,要执行多个语句,使用progn特殊表
     - 循环结构
       循环结构的语法如下:
                        (while (condition)
                              body)
       循环结构由两部分组成,条件列表部分,每次开始执行时判断条件是否为真,当条件为真时执行body里的所有语句一次,然后再次判断
       条件是否为真,继续执行body,直到条件为假为止。

发布了58 篇原创文章 · 获赞 3 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/lldustc/article/details/8711561