Lisp,名称源自列表处理器(英语:List Processor)的缩写,最早由约翰·麦卡锡在1958年基于λ演算创造,演化至今,是历史第二悠久的高级语言,仅次于Fortran,也是第一个函数式编程语言。
1980年代盖伊·史提尔二世编写了Common Lisp试图进行标准化,这个标准被大多数解释器和编译器所接受。还有一种是编辑器Emacs所派生出来的Emacs Lisp
(而Emacs正是用Lisp作为扩展语言进行功能扩展)非常流行,并创建了自己的标准。
Lisp程序是由三个基本构建块
原子(atom)
一个原子是一个数字连续字符或字符串。它包括数字和特殊字符。比如
hello-world
imfidding
123
#name
...
Lisp
列表(list)
列表是包含在括号中的原子和/或其他列表的序列,有点类似于数组。比如
(i am fidding)
(the (1 2 3) is (hello))
Lisp
字符串(string)
字符串是一组括在双引号字符。比如
"hello world"
"你好!"
Lisp
quote
(quote a)
即返回a,等同于 'a
简写。
将quote
写成'
只是一种语法糖,我们更常用的为后者的写法。
atom
(atom a),用来判断a是否为atom类型, 当a是一个atom或者空的列表(list)时,返回原子t,否则返回NIL。
在lisp中,我们用原子t
表示真,用nil
或者()
表示假。
例如
(atom 'a)
Lisp
返回
t
Lisp
eq
(eq x y)
,当x和y指向相同的对象的时候返回t,否则返回NIL。
car
(car x)
要求x是一个表,它返回x中的第一个元素。
cdr
(cdr x)
同样要求x是一个表,它返回x中除第一个元素之外的所有元素组成的表。
全局变量
全局变量有永久值在整个LISP系统,并保持有效,直到指定的新值。
defvar
结构一般声明,例如 (defvar x 123)
Lisp
即声明了一个类型为var的变量符号x,并赋值为123
setq
来声明为定义类型的变量,例如 (setq x 123)
Lisp
局部变量
局部变量是指只在给定的过程中生效。 局部变量也可以使用setq
来声明,此外还有其他两种方式let
与prog
。
(let ((var value) (var2 value2))...)
Lisp
例如
(let ((x 'a)
(y 'b)
(z 'c))
Lisp
即列表中放键值对,将x赋值为a,y赋值为b,z赋值为c。
(prog ((x '(a b c))
(y '(1 2 3))
(z '(a s d)))
Lisp
常量
常量使用defconstant结构声明。例如
(defconstant PI 3.141592)
Lisp
决策就是当条件为true,则执行;当条件为false,则执行其他条件。
cond结构,cond的基本语法规则为
(cond (cod1 action1)
(cod2 action2)
...
(codn actionn))
Lisp
即第一次执行决策cod1
,如果为真,那么执行action1
语句;如果计算解决为nil,那么执行下一个决策cod2
,当所有的条件都为nil,那么结果将返回nil。
if结构,if的基本语法规则为
(if (test-clause) (<action1) (action2))
Lisp
命名函数defun宏用于定义函数,该函数需要三个参数,函数名(name),参数(args),函数体(body),其结构如下
(defun name (args)
"description"
body
)
Lisp
例如
(defun sum (a b c d)
"改行数用于计算4个数总和"
( + a b c d)
)
Lisp
这样就定义了一个简单的函数,即sum函数传入4个参数,用于执行+函数操作,当执行
(write(sum 1 2 3 4))
Lisp
返回
10
Lisp
emacs lisp的语法不止这些,本文只是简单的介绍了一些基本概念,或者说是一些入门级的语法。