ELisp学习
一. 前言 Lisp语言
Lisp诞生的时候包含了9中新思想,其中一些被用于其他高级语言,我们已经习以为常,至今还有2种是Lisp独有的。
- 条件结构 (即if-else结构),在Fortran 1时只有基于底层机器指令实现的goto结构。
- 函数也是一种数据类型 Lisp语言中,函数跟整数和字符串一样,属于数据类型的一种,有自己的字面表示形式(literal representation),能存储在变量中,也能当作参数传递。
- 支持递归
- 变量的动态类型 ,所有变量实际上都是指针,所指向的值有类型之分,而变量本身没有,赋值或绑定变量都相当于复制指针,而不是复制他们指向的数据。
- 垃圾回收机制
- 程序由表达式组成,Lisp程序是一些表达式树的集合,每个表达式返回一个值,大多数后来的程序都由表达式和语句组成。
- 符号类型,符号实际上是一种指针,指向存储在散列表中的字符串,所以比较两个符号是否相等,只需看其指针是否一样即可,而不用逐个字符比较。
- 代码使用符号和常量组成的树形表示法
- 无论什么时候整个语言都是高度可用的,Lisp不真正区分读取期,编译期和运行期,可以在读取期编译或运行代码,也可在编译期读取或运行代码,或在运行期读取和编译代码
若程序语句看起来像数据,则其很容易作为其他数据的输入
二. 执行 Elisp代码
Emacs中切换到scratch 缓冲区
- 将光标移至于表达式闭括号右侧,执行
M-x eval-last-sexp
或C-x C-e
- 选择执行的代码块,使用
M-x eval-region
M-x eval-defun
执行光标所在函数,只可执行由defvar
和defcustom
实现的代码M-x eval-expression
在minibuffer中执行代码M-x eval-buffer
执行整个bufferM-x load-file
加载执行整个文件M-x ielm
启用 elisp shell编辑执行代码
用命令M-x lisp-interaction-mode
切换模式,输入(message "Hello World")
,在行尾用C-j
运行当前行,会在 minibuffer和光标前一行中输出 Hello World
除了用C-j
运行S-expression
外,还可以用C-x C-e
组合键,后者是一个全局按键绑定,会将运行的返回值显示在 minibuffer里
为什么“无人问津”的Lisp可以这么狂?
ELisp语法
叶文彬Elisp简明教程
Practical Emacs Lisp
GNU Emacs Lisp Reference Manual