Common Lisp入门笔记(一)7个基本运算符

摘自 《Lisp语言- 陈光喜》

表达式实例:

>(+ 1 2)

>3

Common Lisp表达式求值规则是:

首先对每个参数从左到右进行求值;

其次将这些已经求值的参数作为运算符函数的参数进行函数调用求值;

所求得的值作为表达式的值返回。

一、Lisp的数据类型

Lisp有其它语言的一切类型,还提供另外其它语言没有两种类型: symbol(符号)和 list(表)。

(1)符号显示时总是被转换为大写。一般要使用 quote 来引用它

>’qwert

QWERT

(2)列表

List(表)是由一对括号包括起来的,括号内有 0 个或多个元素,这些元素可以是任何类型的,也可以是表。要使用 quote 来引用 list,否则它将被 Lisp 求值。

> ‘(1 2 (a b 3) d)

(1 2 (a b 3) d)

也可以使用 list 来建立表:

> (list ‘a ‘b "sin"   1 2)

(A B "sin" 1 2)

>(list ‘(* 2 3) (* 2 3))

((* 2 3) 6)

二、Lisp的7个基本运算符

Lisp的表达式是一个原子(atom)或表(list),原子是一个字母序列,如ab;表是由零个或多个表达式组成的序列,表达式之间用空格分隔开,放入一对括号中。

(1) quote

quote是一个特殊的运算符,可以简写为" ‘ “ ,它的求值规则是什么也不做。通过引用一个表,可以避免它被求值。

>   (quote x)

X

> (quote (a b c))

(A B C)

> ‘x

X

> ‘(a b c)

(A B C)

(2) atom

(atom x)返回原子t (或T),如果x的值是一个原子或是空表,否则返回 ()。在Lisp中,() 即空表可表示为()或nil。

>(atom ())

>T

(3)eq

(eq x y) 如果x 和 y 的值是同一个原子或都是空表返回 T , 否则返回空表 () 。

>(eq ‘a ‘a)

>T

>(eq ‘(a b) ‘(a b))

>NIL

注意(eq ‘(a b) ‘(a b)) 会返回NIL , 因为 ‘(a b) 不是原子

(4)car 和 cdr

(car x)要求参数 x 的值是一个表,它返回 x 的第一个元素。

(cdr x)  要求参数 x 的值是一个表,返回 x 的第一个元素之后的所有元素。

> (cdr ‘(a b c))

(b c)

>(car (cdr ‘(a b c)))

b

(5)cons

(cons x y)要求 y 是一个表,它返回一个表,表的第一个元素是 x,其后是 y 中的所有元素。例如:

> (cons ‘1 ‘(2 3))

(1 2 3)

> (cons ‘(a b) ‘(1 2 3))

((A B) 1 2 3)

(6)cond

在 Lisp 中分支条件可由 cond 操作符完成的。Cond 的形式如下:

(cond (p1 e1) (p2 e2)...(pn  en))

p1 到 pn 为条件,e1 到 en 为结果,cond 操作符依次对 p1 到 pn 求值,直到找到第一个值为原子 t(真)的p,此时把对应的表达式 e 的值作为整个表达式的值返回。

如:

>(cond ((eq ‘a ‘b) ‘first) ((eq ‘1 ‘1) ‘second))

>SECOND

时间: 2024-10-17 01:20:54

Common Lisp入门笔记(一)7个基本运算符的相关文章

Common Lisp入门笔记(二)赋值与输入输出

摘自 <Lisp语言- 陈光喜> 一.赋值 (1)let Lisp中使用let来完成局部变量的定义.其形式为:(let  ((var1 exp1)(var2 exp2)-(varn expn)) exps) 其中操作符 let 表明将定义局部变量. (vari expi)对表示变量名 vari, 该变量的初始值为表达式 expi的值.Let 语句中的 exps 部分为表达式集合,完成所需要的处理.所定义的诸变量 var1,-,varn在这些表达式有效,即在 let 语句体内有效.整个 let

Common Lisp 学习笔记

特殊操作符.函数.宏 0.0 format CL-USER>(format t "hello world") ;t=>*standard-output* hello world NIL CL-USER>(format t "~a:~10t~a" "This is" "a shinny day") This is: a shinny day NIL ~a=>美化输出(如字符串去引号.关键字去前导冒号),消

Common Lisp学习笔记(九)

9 Input/Output 9.2 string 9.3 format 9.4 read 9.5 yes-or-no-p 9.6 with-open-file 9.7 writing files with with-open-file 9.8 parameters to format directives 9.9 file EOF 9 Input/Output 9.2 string string在lisp中用双引号括起来,它的值也是自己本身,和数字一样,string不是symbols stri

Common Lisp学习笔记(六)

6 list data structure 首先注意cons的用法 (cons 'w '(x y z)) -> (w x y z) 但是想在list的结尾添加一个元素就不能这样实现,eg, (cons '(w x y) 'z) -> ((w x y) . z) 6.3 the APPEND function append函数可以参数是两个list,并将两个list的元素合并在一起,如果其中有一个是nil,则结果和另一个list相同 > (append '(a b) '(c d)) (a

common Lisp学习笔记(十三)

lisp_chapter13 13 Arrays, Hash Tables, and Proterty Lists 13.2 array 13.5 make-array 13.6 string as vectors 13.7 hash tables 13.8 priority list lisp toolkit: room 13.11 coerce 13 Arrays, Hash Tables, and Proterty Lists 13.2 array 数组是内存中的一些连续的存储空间,一维的

common Lisp学习笔记(十二)

12 Structure and The Type Syetem 12.2 typep, type-of 12.3 defining structures 12.5 accessing, modifying structs 12.6 kwargs to constructor functions 12.7 修改结构体定义 12.8 print func for structs 12.9 equality of structs 12.10 inheritance 12 Structure and

Common Lisp学习笔记(十一)

11 Iteration and Block Structure 11.2 dotimes and dolist 11.4 recursive, iterative 11.6 比较dolist, mapcar, recursion 11.7 DO macro 11.8 隐式赋值的好处 11.9 do* 11.11 implicit blocks lisp toolkit: time 11.13 optional args 11.14 rest args 11.15 keyword args 11

Common Lisp学习笔记(七)

7 Applicative Programming 7.2 funcall 7.3 mapcar 7.4 manipulating tables with mapcar 7.5 lambda expressions 7.6 find-if 7.7 my-assoc 7.8 remove-if, remove-if-not 7.9 reduce 7.10 every debug tool: trace 7.11 operating on multiple lists 7.12 function函数

Gnu Emacs Lisp入门笔记

1.在Lisp中,数据和程序都是以同样的方式表示:它们都是由空格分隔 的.由括号括起来的单词.数字或者其他列表的列表.2.列表前面的单引号:表示不要对这个列表做任何操作,而仅仅是按其 原样.如果一个列表前没有引号,则第一个符号表示计算机要执行的命 令,用来对列表的其余部分进行操作. 3.对一个符号表达式求值几乎总是使Lisp解释器返回一个值,同时可能 产生一个附带效果,不然就产生一个错误消息.