Common Lisp学习笔记(2):基本求值

《Successful Lisp》Chapter 3 - Essential Lisp in Twelve :Lesson 2 - Essential Evaluation  笔记

形式(Form):意味着被求值

列表,原子都可以被求值,所以它们都是形式。
对原子形式求值时,原子被lisp作为名字对待,返回该名字的值(可以理解为标签,以及返回标签下面的东西)。
注意:原子既可以拥有变量值,也可以拥有常量值,所以原子并不同于变量或常量。
数字是原子,数字求值得到数字本身,也就是自求值(self-evaluating).
通过defconstant定义的符号具有常量值.
KEYWORD包中的关键词符号以字符“:”(包前缀)开头以及通过使用英文双引号”“包围来表示的字符串,它们也是自求值的.
符号可以通过多种方法赋值,而Lisp实际上为每一个符号保留着多个值,比如变量值、函数值以及符号关联的文档.
列表作为形式时,为了满足能够被求值的要求,它的第一个元素必须是一个拥有函数值的符号或者称为lambda表达式的特殊形式.
对Lisp而言,+,-,*,/四个符号被称为通用算术操作符,它们每一个都与相应的函数关联,当求值形式(+ 2 3)时(这样的形式被称为前缀表达式),Lisp会首先从第二个元素开始从左向右依次求出任意一个形式的值,最后求得第一个元素即本例中符号”+”的函数值,然后调用返回的”加法”函数到参数的返回值,最后返回期望的结果5.
对列表形式求值时,lisp将其视为函数调用.列表的第一个符号命名了一个函数,剩余的元素求值后作为函数的参数传入.
求值顺序如下:

1.从左向右求出参数的值
2.求得第一个元素关联的函数
3.调用函数到参数值

15
-> 15
"Hello world!"
-> "Hello world!"
(+ 4 9)
-> 13
(- 5 7)
-> -2
(* 3 7)
-> 21
(/ 8 24)
-> 1/3
(atom 13)
-> T
(numberp 15)
-> T
(atom :你好)
-> T
(atom '(1 2))
-> NIL

像上面这样如同atom以及numberp返回T或NIL(Lisp的真值与假值)的函数称为谓词(predicates), 谓词通常以字母p结尾.而NIL是Lisp唯一的假值,其它所有东西都是真值.

返回多值,Lisper常用的简单方法如下:

(values 1 2 3 :嘿 "晚安")
-> 1
-> 2
-> 3
-> :-> "晚安"

注意Lisp通常不使用传入一个变量符号,并更改变量符号的值的方法来返回多值,这是为了避免破坏性.使用函数的返回值而不改变所调用的参数的编程风格被称为函数式编程.
Lisp中列表的三种形式:函数,特殊形式(Special forms),宏(macro).当列表形式不是函数时,求值顺序会发生变化.common lisp提供了数个特殊操作符,并允许用户通过宏来改变求值规则.

猜你喜欢

转载自blog.csdn.net/skydoot/article/details/80198764