咱也学学Lisp(3)–表达式
29 Sep 2012
原文见:http://lisp.plasticki.com/
表达式是什么?就是列表,还有点特殊,可以求值的列表。
对于 (/ (- 7 1) (- 4 2)) ,求值过程是怎样的呢?
从左向右看,是一个除号,和两个列表,两个列表又分别是减号和两个数字,先求值这两个列表:找到 (- 7 1) ,求值得 6 ,找到 (- 4 2) ,求值得 2 ,现在表达式变成了 (/ 6 2) ,求值得 3 ,计算完成。
那么对于一个表达式,不求值不行吗?当然可以,像这样:
CL-USER> (quote (+ 2 3))
(+ 2 3)
嘿,得到的并不是 5 ,而是 (+ 2 3),为什么?从左向右看,是一个quote,和一个列表(注意quote后面只能跟一个东西哦),对于遇到quote的情况,要对quote后面的东西原封不动。这个是Lisp尤其特殊的地方。
quote可以简写为一个单引号 ' ,是不是很方便呢。
CL-USER> '(list (+ 3 4))
(LIST (+ 3 4))
再次强调,单引号后面的东西是原封不动的。
CL-USER> '''(list (+ 3 4))
''(LIST (+ 3 4))
事实上,quote也是求值了,只不过求值的结果是不求值。
那这有什么用呢?
quote得到的结果可以用eval来求值。
CL-USER> (eval '(list (+ 3 4)))
(7)
前面提到 '(list (+ 3 4)) 得到结果为 (LIST (+ 3 4)) ,eval的作用是对这个结果求值,得到 (7) ,eval也是函数,对eval的求值就是对eval后面的表达式(只能有一个)求值。
总之,Lisp就是求值,求值,求值,有些求值一般,有些求值特殊:
CL-USER> ()
NIL
CL-USER> 99
99
空表求值为NIL,数值求值为自己。
想一想这个求值结果是什么?
CL-USER> (eval (eval (eval '''(list (+ 3 4)))))
?