第二章 welcome to lisp
函数调用是一般用()包裹,第一个参数为函数名,后面的参数为实参。
如:加法:(+ 1 2) → 3
此种表示法为前序表示法。

CLISP的求值方式:
1.先对参数从左到右求值,函数符号求值则为函数体,实参符号求值则为实参值
2.将实参值应用到函数体中,用于求出最终的值并返回。
特殊的操作符:quote,其并不是按照上面的求值规则,而是特定的规则。
quote接受一个参数并返回那个参数,即:什么也不做,只是将接受的参数值返回。
quote的语法糖为:'(单引号),使用'等价于使用quote。
如:(quote (+ 1 2)) → (+ 1 2)或'(+ 1 2)→(+ 1 2)

与其他语言不同的数据类型有:符号和列表
符号通常不对自身求值,若想引用一个符号,则要使用'(单引号)。
列表是被括号包住的零个或多个的元素来表示的。可以是任何类型,也包括列表。
要使用列表的话,就要引用,不然lisp会以为是一个函数调用。如:'(1 "aa" (1 2))
引用之后则保护了整个列表及里面的元素不被求值。
可以用list创建一个列表,表示空列表的方式:()或nil
可以用cons来构造列表,若第二个参数是列表,则返回一个由第一个参数和第二个列表组成的新列表。
取出列表中的元素操作:car、cdr
car:取出列表第一个元素
cdr:取出列表第一个元素之后的元素。
其中,还可以使用英文单词,first、second、third...取出特定位置的元素

符号t表示“真”的缺省值
listp:判断一个元素是不是列表。
not:非,真为假,假为真

判断语句:if
if test 语句1 语句2 : test为判断条件,若为真,执行语句1,否则执行语句2

and:与,可以接受多个参数,判断参数是否为真,一直判断直到有一个参数为假或到最后,停止求值。
or:或,可以接受多个参数,判断参数是否为真,一直判断直到有一个参数为真或到最后,停止求值。

总结即为:and:一假即假,or:一真即真。这两个操作符为宏。
defun:用于定义函数
格式:(defun 函数名 (参数列表) 函数体)

format:输出函数,第一个参数表示输出的地方,第二个参数为输出的内容。若第一个参数为t,则表示输出缺省的地方,通常为顶部。
其中,格式化的表示:~A表示被填入的地方,~%表示换行,~t:空格,t前加数表示空几格。

read:输入函数,若没有参数则默认读取缺省的地方,通常是顶层(控制台)。接受一个用户输入并返回。

let:定义一个局部变量
格式:(let ((变量名 变量初始值)...)),其中,变量在let所在的范围内有效,即let所在的括号内。

numberp:判断一个元素是不是为数字。
其实可以发现,判断类型的都是类型+p的格式。

defparameter:定义一个全局变量。通常定义全局变量的通用记法为:*符号*,如:*sum*。定义时要制定一个初始化值。如:(defparameter *a* nil)
defconstant:定义一个全局常量。定义时也需要制定初始值。且不能使用setf改变其值。
boundp:判断一个变量是否为全局变量。如:有一个全局变量*d*,(boundp '*d*)→T。
注意:使用setf给一个未定义的变量名赋值时会默认生成全局变量。
如:加法:(+ 1 2) → 3
此种表示法为前序表示法。
CLISP的求值方式:
1.先对参数从左到右求值,函数符号求值则为函数体,实参符号求值则为实参值
2.将实参值应用到函数体中,用于求出最终的值并返回。
特殊的操作符:quote,其并不是按照上面的求值规则,而是特定的规则。
quote接受一个参数并返回那个参数,即:什么也不做,只是将接受的参数值返回。
quote的语法糖为:'(单引号),使用'等价于使用quote。
如:(quote (+ 1 2)) → (+ 1 2)或'(+ 1 2)→(+ 1 2)
与其他语言不同的数据类型有:符号和列表
符号通常不对自身求值,若想引用一个符号,则要使用'(单引号)。
列表是被括号包住的零个或多个的元素来表示的。可以是任何类型,也包括列表。
要使用列表的话,就要引用,不然lisp会以为是一个函数调用。如:'(1 "aa" (1 2))
引用之后则保护了整个列表及里面的元素不被求值。
可以用list创建一个列表,表示空列表的方式:()或nil
可以用cons来构造列表,若第二个参数是列表,则返回一个由第一个参数和第二个列表组成的新列表。
取出列表中的元素操作:car、cdr
car:取出列表第一个元素
cdr:取出列表第一个元素之后的元素。
其中,还可以使用英文单词,first、second、third...取出特定位置的元素
符号t表示“真”的缺省值
listp:判断一个元素是不是列表。
not:非,真为假,假为真
判断语句:if
if test 语句1 语句2 : test为判断条件,若为真,执行语句1,否则执行语句2
and:与,可以接受多个参数,判断参数是否为真,一直判断直到有一个参数为假或到最后,停止求值。
or:或,可以接受多个参数,判断参数是否为真,一直判断直到有一个参数为真或到最后,停止求值。
总结即为:and:一假即假,or:一真即真。这两个操作符为宏。
defun:用于定义函数
格式:(defun 函数名 (参数列表) 函数体)
format:输出函数,第一个参数表示输出的地方,第二个参数为输出的内容。若第一个参数为t,则表示输出缺省的地方,通常为顶部。
其中,格式化的表示:~A表示被填入的地方,~%表示换行,~t:空格,t前加数表示空几格。
read:输入函数,若没有参数则默认读取缺省的地方,通常是顶层(控制台)。接受一个用户输入并返回。
let:定义一个局部变量
格式:(let ((变量名 变量初始值)...)),其中,变量在let所在的范围内有效,即let所在的括号内。
numberp:判断一个元素是不是为数字。
其实可以发现,判断类型的都是类型+p的格式。
defparameter:定义一个全局变量。通常定义全局变量的通用记法为:*符号*,如:*sum*。定义时要制定一个初始化值。如:(defparameter *a* nil)
defconstant:定义一个全局常量。定义时也需要制定初始值。且不能使用setf改变其值。
boundp:判断一个变量是否为全局变量。如:有一个全局变量*d*,(boundp '*d*)→T。
注意:使用setf给一个未定义的变量名赋值时会默认生成全局变量。
serf:赋值,如:(setf a 6)。一般通过setf赋值会隐式的创建一个全局变量
remove:接受一个对象和列表,返回一个去除这个对象的一个列表,而原列表不变。
do:迭代操作符,和let一样,do也可以创建变量。
格式:(do ((变量 初始值 迭代值)) (停止条件 迭代体))
如:(do ((i 1 i+1))
((= i 5) 'over)
(format t "~A" i)))
progn:接受任意的表达式,并依次求值,并返回最后一个值。
function:接受一个函数,并返回一个相关联的对象。
function的语法糖为#' 此缩写称为升引号。
apply:接受一个函数和一个参数列表,将参数列表应用到此函数并返回其执行的结果。
注意:第一个参数是函数,第二个参数为:列表。
funcall:接受一个函数和任意的参数,与apply作用一样,将参数应用到函数上并返回执行的结果。
注意:与apply不同的是,第一个参数为函数,后面可以有多个参数,而apply接受的是一个将参数封装的列表。
lambda:lambda表达式,可以叫做匿名函数。
格式:(lambda (参数列表) (函数体))
clisp中,变量可以声明为任何类型,只会在运行时检查其类型。
typep:判断一个变量是不是某类型。第一个参数为变量,第二个参数为类型。