Lisp

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/DanielDingshengli/article/details/81843827

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(quotea 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) 定义兼调用

猜你喜欢

转载自blog.csdn.net/DanielDingshengli/article/details/81843827