Lisp(“LISt Processing”)是一种古老而强大的编程语言,特别适合处理符号数据和列表。Lisp 是一种以括号和递归见长的语言,它启发了许多编程范式。以下是一个基础教程,帮助你快速了解 Lisp 的基本语法和功能。
1. 认识 Lisp 的基本特性
Lisp 的核心思想是“代码即数据,数据即代码”。在 Lisp 中,代码是由列表(list)构成的,而列表的本质是括号包裹的表达式。典型的 Lisp 表达式格式如下:
(操作符 参数1 参数2 ...)
例如,(+ 1 2)
表示“1 加 2”,相当于其他编程语言中的 1 + 2
。
2. Lisp 基础语法
(1) 数据类型
Lisp 支持多种数据类型,最常用的有:
- 数字:整数、浮点数,如
42
、3.14
- 布尔值:Lisp 中
T
表示真,NIL
表示假 - 符号(Symbol):用于变量和函数名,如
x
、my-var
- 字符串:如
"hello world"
- 列表:Lisp 的核心数据结构,如
'(1 2 3)
或(list 1 2 3)
(2) 基本算术操作
Lisp 中提供了简单的算术运算,以下是几个例子:
(+ 1 2) ; 加法,结果为 3
(- 5 3) ; 减法,结果为 2
(* 2 3) ; 乘法,结果为 6
(/ 10 2) ; 除法,结果为 5
(3) 变量定义
使用 setq
来定义变量:
(setq x 10) ; 将 x 赋值为 10
(setq y (+ x 5)) ; 将 y 赋值为 x + 5 的结果,即 15
(4) 条件判断
Lisp 中的条件语句使用 cond
,类似于其他语言中的 if-else
:
(cond ((> x 0) "x is positive")((< x 0) "x is negative")(t "x is zero"))
其中 t
代表“默认情况”,即当没有其他条件满足时执行的分支。
3. 函数定义
Lisp 的函数定义使用 defun
,格式如下:
(defun 函数名 (参数列表)函数体)
例如,定义一个简单的加法函数:
(defun add (a b)(+ a b))
调用该函数:
(add 2 3) ; 结果为 5
4. 列表操作
Lisp 中列表是非常重要的数据结构,以下是一些基本的列表操作函数:
car
:获取列表的第一个元素cdr
:获取除第一个元素外的其他元素cons
:将一个元素添加到列表开头list
:创建一个新列表
示例:
(setq my-list '(1 2 3 4))
(car my-list) ; 结果为 1
(cdr my-list) ; 结果为 (2 3 4)
(cons 0 my-list) ; 结果为 (0 1 2 3 4)
(list 1 2 3) ; 结果为 (1 2 3)
5. 递归
Lisp 中非常适合使用递归来处理问题。例如,实现一个计算阶乘的递归函数:
(defun factorial (n)(if (<= n 1)1(* n (factorial (- n 1)))))
调用 factorial
函数:
(factorial 5) ; 结果为 120
6. 高阶函数与 mapcar
Lisp 提供了高阶函数(即将函数作为参数传递的函数)。mapcar
是常用的高阶函数,用于对列表中的每个元素应用指定函数:
(mapcar #'1+ '(1 2 3 4)) ; 结果为 (2 3 4 5)
(mapcar (lambda (x) (* x x)) '(1 2 3 4)) ; 结果为 (1 4 9 16)
7. Lambda 表达式
Lambda 表达式用于定义匿名函数,例如:
(lambda (x y) (+ x y))
可以直接使用匿名函数:
(funcall (lambda (x y) (+ x y)) 3 4) ; 结果为 7
8. 宏(macro)
宏允许你在编译阶段改变代码结构。宏和函数类似,但它们操作的是表达式的代码,而不是结果。简单示例:
(defmacro square (x)`(* ,x ,x))(square 4) ; 结果为 16
Lisp 的基本概念和语法并不复杂,但其强大的递归处理能力和符号计算特性让它在特定场景中表现出色。通过掌握基本的列表操作、函数定义、条件语句和宏,你已经具备了在 Lisp 中编写基础程序的能力。
作者简介
前腾讯电子签的前端负责人,现 whentimes tech CTO,专注于前端技术的大咖一枚!一路走来,从小屏到大屏,从 Web 到移动,什么前端难题都见过。热衷于用技术打磨产品,带领团队把复杂的事情做到极简,体验做到极致。喜欢探索新技术,也爱分享一些实战经验,帮助大家少走弯路!
温馨提示:可搜老码小张公号联系导师