【Successful Lisp】语法(2) Form

来源:互联网 发布:怎么变得成熟稳重 知乎 编辑:程序博客网 时间:2024/06/16 08:51

 1.4 Form

List symbol都是Form

Form意味着需要求值(tobe evaluated)

 

如果formsymbol,那求值是简单的,只需要取得symbol的值。可以认为是symbol是一个变量,该变量的值可以可变的(variable),也可以是常量(constant)。

 

用defconstant来定义个常量。比如 (defconstant hello "hello")

 

如果symbol是一个数字,那么该数字认为是自我求值的(self-evaluating),他的值就是他自身。

关键字(keyword)也被认为是自我求值的。

 

一个symbol可以通过许多不同的途径来得到他的值。Lisp为每一个symbol保存了几个不同的值,其中一个是通常作为变量的值,另外一个是symbol作为函数来求值,还有一些值包括symbol的文档,symbol的属性等等,我们会在之后,来慢慢介绍。


如果form是一个list,那么list的第一个元素应该是一个symbol或者一个特殊的称为lambdaform(我们会在稍晚些章节介绍lambda)。这个symbol必须是一个function

我们这里先以简单的算数运算来做说明,更复杂的内容在我们介绍过function之后,再做进一步的介绍。

Lisp中,+,—,*/这四个symbol分别表示加减乘除。比如:

>(+ 4 5)

9

>(* 4 9)

36

lisp对(+45)这样的list进行求值的时候,就会按照symbol表示的运算来求值。更进一步来说,当lisp中对一个list来求值的时候,会对第一个symbol作为一个函数调用,其他的symbol作为参数。

比如:

>(atom 1)

T

>(numberp123)

T

>(atom foo)

T

>(numberp:foo)

NIL

其中atom用来判断参数是不是一个atomnumberp用来判断一个参数是不是一个数字。

这里我们还有一个例子:

>(atomtest-google)

NIL

我们之前不是说可以认为atomsymbol是一致的么,这里怎么会nil,这个原因,我们之后的章节会有解释。

注意,lisp对一个函数求值的时候,是从左往右。

函数可以有任意数量的返回值。

当返回值多于一个时,有若干不同的方案来保存,比如之后我们介绍的structure,或者用若干个变量来存储,不过,这些方式在lisp中看上去有些蹩脚,这里我们介绍以lisp的方式来存储多个返回值,采用valuesform:

>(values 1 23 :hi “baby”

1

2

3

:HI

"baby"

 

注意(values1 2 3 :hi “baby”)之后,输出的每一行代表values中的一个值,当然,不同的编译器显示的可能不同,但含义是一样的。