Lisp,好晦涩的语言啊.............
一、函数
定义函数语法:
(defun name (parameter*)
"optional documentation string."
body-form*) -------------注:*代表可以多个
最后一个表达式的值被作为整个函数的值返回;
RETURN-FROM特殊操作符可以从函数内部任意地方立即返回
(defun foo (a b &optional c d) (list a b c d))------&optional后的2个参数C和D都是可选的,有点陷阱啊.
-supplied-p检测调用时是否提供了实参,是则值为T,否则为NIL
(defun foo (a b &optional (c 3 c-supplied-p)) (list a b c c-supplied-p)) -----(foo 1 2) --->(1 2 3 NIL)
&rest关键字之后是可选形参,即可以是任意个形参。(defun + (&rest number)...)
&key关键字形参 (defun foo (&key a b c) (list a b c)) -----------(foo a:1 c:3)----->(1 NIL 3)
(defun foo (&key (a 0) (b 0 b-supplied-p) (c (+ a b)))
FUNCTION获得函数对象,别名写法:#'
funcall---需要确切知道函数实参个数 (foo 1 2 3)=(funcall #' foo 1 2 3)
apply----后面参数传递的是列表
匿名函数----lambda
----------------------------------------------------国庆回家过节咯
二、变量
词法变量-----局部变量;动态变量-----全局变量
同一个变量可以改变其类型,变量没有类型,数值有类型;
引入变量的方式:1、函数形参;2、LET及LET*
LET及LET*区别,LET*后面变量可以引用早先引用的变量。如:
(let* ((x 10)
(y (+x 10)))
(list x y))
三、数据结构
quote(')保证随后的表达式不被求值
list------创建列表
cons------构造列表
car---------取第一个元素
cdr---------取第一个元素之后的所有元素
逻辑值
任何非nil的东西,在逻辑上均为真
类型
对象总是不止属于一个类型。举例来说,数字 27 的类型,依普遍性的增加排序,依序是 fixnum 、integer 、 rational 、 real 、number 、 atom 和 t 类型
typep------判断一个对象是否属于某个类型 (typep 27 'integer)
----------------------------------------------
可恶的LISP,原来你只是擅长写编译器啊,怪自己没仔细审视。
以后有时间再学习吧。。。