先说一说我对Common Lisp函数式编程语言的个人理解,
首先函数分为:声明,定义和调用。 在c语言中,.h文件 实现函数的声明,.c文件 实现函数的定义。
而在Common List中,函数的声明和定义结合在一起,例如
(defun sum (alist)
...)
defun为函数声明的关键字,sum为函数名,alist为函数参数。
(sum alist)
上述代码为函数调用的代码。 其实我们不难发现,在common lisp中,几乎所有的语法都跟该函数调用的代码非常相似,如(a 2)变量赋值,(+ 3 3)3和3相加等,这正是lisp编程中独一无二的特点。
Common Lisp 是一门运行态语言(runtime language),下面举例说明其编译和运行方式:
(defun sum-list (num-list)
(if (null num-list)
0
(+ (car num-list)
(sum-list (cdr num-list)))))
(sum-list '(2 3 4 5))
---> 14 输出正常
然而,我们改一下函数调用的方式
(sum-list '("hello" 2 3 4 5))
根据上面的算法,函数会递归计算出14后与"hello'相加,此时,动态运行检测出"hello"不能相加14,报错。
由此可见,Common Lisp在编译时,仅会检测括号匹配,函数调用方式等错误,像上述的错误,只有在程序运行时,才能够检测出来。
再例如: