函数
fboundp:判断一个函数名是否有一个给定的符号。
测试代码:
CL-USER> (fboundp '+)
T
symbol-function:配置一个名字给一个函数。
测试代码:
CL-USER> (setf (symbol-function 'add2) #'(lambda (x) (+ x 2)))
#<FUNCTION (LAMBDA (X)) {25A25F15}>
CL-USER> (add2 1)
3
一般地,使用字符串作为函数的第一个表达式,用于注释此函数。原因是因为函数返回最后一个表达式的值,所以字符串放在第一个表达式处,则不会有任何副作用。此字符串称为文档字符串。
documentation:取出函数的文档字符串。第一个参数为'+函数名,第二个参数为:'function
例子:
(defun test ()
"test function"
'test)
测试代码:
CL-USER> (test)
TEST
CL-USER> (documentation 'test 'function)
"test function"
局部函数
通过defun或symnol-function配合着setf定义的函数都是全局函数。局部函数使用labels定义。labels:第一个局部函数
格式:labels (name param .body) 调用局部函数
说明:name为局部函数的名字,在用name调用局部函数的时候则等价于调用 (lambda param .body)。param为局部函数的参数,.body为函数体。其中局部函数可定义多个
测试代码:
CL-USER> (labels ((add2 (x) (+ x 2))
(dis (x) (format t "~A" x)))
(dis (add2 1)))
3
NIL
参数列表
函数参数分为:必要参数、剩余参数、选择性参数、关键字参数必要参数:未用参数关键符号标识的参数都叫必要参数
剩余参数:在函数的参数列表中最后一个变量前插入&rest符号,当函数被调用时,这变量会被设成一个带有剩余参数的列表。
选择性参数:函数参数列表中:optional后的参数都是选择性参数。此种参数可传可不传值,不传值缺省为nil
关键字参数:函数参数列表中:key之后的参数都是关键字参数,传值时可用":变量名"传入对应的值,而不是按顺序。缺省为nil。
闭包
若一个函数在一个词法变量的作用域里被定义时,仍然可以参照到那个变量,即便它被作为一个值返回至变量被创建的语境之外。当一个函数参照到外部定义的变量时,称为自由变量。
一个函数参照到一个自由的词法变量时,称为闭包。
动态作用域
局部和全局的区别就是词法作用域的词法变量和动态作用域的特别变量的区别。也即词法变量和特别变量的区别。要使一个变量是动态作用域的,则需要在它出现的语境中宣告它是special。
编译
complied-function-p:检查一个函数是否有被编译。compile-file:编译整个文件
递归
使用递归解决一个问题,只需要考虑两件事:
1.必须要示范如何解决一般情况的问题,通过将问题切分成有限小并更小的问题。
2.必须要示范如何通过有限的步骤,来解决最小的问题(基本情况)
即:需要知道递归结束的条件,以及递归的通用过程。