Common Lisp学习笔记

~a

字符串中的~a是美化指令,将一个实参输出为人类可读的形式,关键字将不带前导冒号,字符串不带引号.

~t

~t指令用于制表,不需要实参.~后跟上制表符的数量,例如~10t.

~%

输出一个换行,不需要实参.

~{和~}

对~{和~}之间的内容进行列表循环操作.

(format t "~{~a ~a~}" (list :name "Bob" :age 20 :name "Jack" :age 19))

force-output函数

确保Lisp在打印提示信息之前不会等待换行,参数1是关联到当前终端输入流的变量.

read-line函数

读取字符串,不包括换行符,参数1是关联到当前终端输入流的变量.

#’/function特殊操作符

获取函数引用,比如#’evenp.

lambda函数

参数1为形参列表,参数2为表达式.

下面是一个判断是否为偶数的lambda:

(lambda (x) (= 1 (mod x 2)))

getf函数

获取列表中关键字所对应的值,参数1为列表,参数2为关键字.

(getf (list :a 1 :b 2 :c 3) :b)

&key

关键字形参,写在形参列表开始处.

(defun foo (&key a b) (list a b))
(foo :b 1 :a 2)

形参还可以用一个包括形参名,默认值,supplied-p形参的列表构成,supplied-p形参表示实参是否传入.

(defun foo (&key (a 10 a-p) (b 20 b-p)) (list a b a-p b-p))

t

逻辑真

setf宏

通用赋值操作符,参数1为左值,参数2为右值,后续参数沿用参数1和参数2.

现代编程中最常用的赋值操作符.

mapcar函数

返回对列表元素调用函数后的新列表,参数1为函数,参数2为列表.

remove-if函数

返回一个返回一个删除原列表中被选择器选中的内容的新列表,参数1为选择器,参数2为列表.

(remove-if #'(lambda (x) (= x 1)) (list 1 2 3 4))

remove-if-not函数

与remove-if函数正好相反,删除所有未被选择器选中的内容,同样返回一个新列表.

reverse函数

返回一个逆序列表,参数1为列表.

‘或quote

防止求值,得到符号本身.

`

阻止表达式被求值,但逗号开始的表达式会被求值.

,@

将求值出的列表嵌入外围列表中.

`(and ,(list 1 2 3))  -> (AND (1 2 3))
`(and ,@(list 1 2 3)) -> (AND 1 2 3)

&rest

写在实参列表中,表示接受任意数量的实参,这些实参会被收集列表传入&rest后面跟的变量.

=函数

比较数字之间的等价,参数1和参数2为数字.

eq函数

测试对象标识,只有对象相同时等价.

eql函数

在对象类型相同且值相同时等价.在我的sbcl上似乎与eq函数没有区别.

equal函数

递归具有相同结构和内容的列表为等价.

equalp函数

equal函数的忽略大小写版本,在数学意义上相同的数字上也等价.

;;;;

文件头注释.

;;;

段落注释(一大段代码).

;;

代码注释(一小段代码),使用与代码相同的缩进.

;

行尾注释.

return-from特殊操作符

从代码块中返回,参数1为返回的代码块名(在函数中则为该函数名),参数2为返回的对象.

funcall函数

调用函数,参数1为函数引用,后续参数为调用函数的参数.

(foo 1 2 3)=(funcall #'foo 1 2 3)

apply函数

调用函数,参数1为函数引用,后续参数为调用函数的参数,最后一个参数必须为列表.

let特殊操作符

引入新变量,参数1为包含变量名与值列表的列表,参数2是一条表达式,表达式的结果将作为let的返回值.

(let ((x 1) (y 2) (z 3)) (+ x y z))

dotimes宏(?)

基本的计数循环.

(dotimes (x 10) (format t "~d " x))

let*特殊操作符

let的变体,允许在变量列表中使用早先引入的变量.

(let* ((x 10)
       (y (+ x 10)))
  (list x y))

defvar/defparameter

创建全局变量,区别在于defvar只有当变量未定义时才赋值.

参数1为变量名,参数2为初始值,参数3为文档字符串,参数2和3都是可选的.

根据命名约定,全局变量名应在左右加上符号,例如count*.

incf修改宏

变量自增,参数1为变量名,可选参数2为增值.

defconstant

定义常量,参数与defparameter类似.

常量名左右加上+符号方便区分.

decf修改宏

变量自减,参数1为变量名,可选参数2为减值.

rotatef修改宏

交换变量值并返回NIL,参数1,2为变量名.

(let ((a 1) (b 99))
     (rotatef a b)
     (format t "~d ~d" a b));99 1

shiftf修改宏

所有参数的值向左移动,第一个参数成为函数返回值.