195_common lisp中的let以及let*
这是两种略有不同的变量引入方式,主要的差异点在于变量的作用域。
首先看一下let最简单用法:
上面,引入3个变量的同时,给两个变量进行了“初始化”。同时,也能够看得到另一个问题,也就是没有初始化的变量默认的初始值是多少?这个初始化的问题,是我最初学习的时候就考虑到的,在教程中得到了答案,在这里做一次测试。
如果做一个修改,具体如下:
这样,其实是一个错误的设计。因为y在定义的时候x还没有生效,软件解析分析还没有到达let的形式体重。什么是形式体呢?就是let引入的变量列表后面的部分,不包括变量列表。因此,上面的代码运行会报错。
上面是报错信息,提示变量x还处于未绑定的状态。
相比之下,可以认为let*会让作用域扩大,包含变量列表部分。因此,设计如下的代码是可以的:
从上面结果看,不仅运行成功了而且y的初始化时在x初始化且绑定了初始值初始值之后。暂时没有考虑到为什么非得区分两种方式,但是有一点事可以预见的,这种设计会让有些代码的设计简化。