Lisp
基本概念
lisp作为符号处理语言,处理的对象主要是符号表达式,即S表达式,而并非数。
原子 atom 1.十进制数 2.以字母或问号开头,可以包含中横线、字母或数字;
例如 1 ab ?c-d NIL
S表达式 1.原子是S表达式式 2.( S表达式 圆点. S表达式) 组成;
例如:atom (a(b.c))
点对表示法 1. 如果圆点右边紧接着一个左括号,可以去掉圆点,左右括号;
如: (a.(b.(c.d)) ——> (a b c.d)
2.去掉.nil (a.nil)——> (a)
表
lisp常用的特殊的s表达式——表。
空表
()或者是NIL
1.是atom 2.表示真值假 3.表示空表
是唯一一个既是原子又是表的表达式。
注意:原子除了nil外都不是表,a不是表,(a)是表,因为(a)即(a.nil)。
区分程序和数据 用单引号
(G(quote(a b))
(G `(a b))
如果表达式本身就是数原子或者T或者nil,求值时,他们有没有`或quote都没关系。
七个基本运算符
1.quote
2.atom
3.eq (eq x y) 如果 x 和 y 的值是同一个原子或都是空表返回 t,否则返回空表() (即 nil)
4.car (car x)要求参数 x 的值是一个表,它返回 x 的第一个元素
5.cdr (cdr x) 要求参数 x 的值是一个表,返回 x 的第一个元素之后的所有元素
6.cons (cons x y)要求 y 是一个表,它返回一个表,表的第一个元素是 x,其后是 y 中的所有元素
7.cond
> (cond ((eq 'a 'b) 'first)
((atom 'a) 'second)
((> 4 6) (+ (* 2 3) 7)) )
second
输入输出
1.format
> (format t "~%The clever dog can do ~A + ~A =~A ." 2 3 5)
The clever dog can do 2 + 3 =5 .
NIL
//Fortmat 的第一个参数是输出地,此例的参数 t 表示输出到 toplevel,在 toplevel 环境下用户输入的表达式都将被求值。;第二个参数是输出格式串,
//~%表示换行,~A 表示该位置将用对应的参数进行替换
//~S 可以打印出控制符,而~A 不能。~P 打印复数后缀”s”
//~D ~B ~O ~X ~R 为整数控制符,它们分别打印十进制、二进制、八进制、十六进制、基数
//~E ~F ~G ~$为浮点数控制符,分别按照指数格式、定点格式、浮点格式、浮点定点结合方式
//~n%,~n&,~| 为空白控制符,分别表示 n 换行,n-1 行,新一页
2.read
(setf a (read))
Lisp
LISP
函数作为参数
> (apply #'area '(2))
12.5663706143592
> (apply #'* '(1 2 3 4))
24
> (funcall #'area 2)
12.5663706143592
> (funcall #'* 1 2 3 4)
24
//apply 与 funcall 的区别。Apply 要求其最后一个参数是一个表,表中列出相应的函数所需的
参数,如 area 需要一个参数,所以例中 apply 使用方式是 (apply #’area ‘(2)),相当于(area 2);funcall
则不同,函数所需的各参数直接跟在 函数名参数之后,不能是表,所以例中(funcall #’* 1 2 3 4),相
当于(* 1 2 3 4)。
Lambda表达式
(f a1 a2 … an) 并且 f 的值是一个函数(lambda (p1 p2 … pn) e),则上述表达式等价于((lambda (p1 p2 … pn) e) a1 a2 … an) 定义兼调用