Welcome

首页 / 软件开发 / 数据结构与算法 / 基于文本替换的解释器:let表达式,布尔类型,if表达式

基于文本替换的解释器:let表达式,布尔类型,if表达式2015-01-12

let表达式

let表达式用来声明一个变量。 比如我们正在写一个模拟掷骰子游戏的程序。 一个骰子有6个面。 所以这个程序多次用到了6这个数字。 有一天,我们忽然改变主意,要玩12个面的骰子。 于是我们不得不仔细查找源代码,把里面的6改成12。 对于一个较大的程序,这是灾难的开始。 有时我们会漏掉几个6,有时我们会把几个指的不是骰子面数的6误改成12。 这种灾难被称作“魔术数字”。 避免魔术数字的方法一般是声明一个变量——比如说变量(a)——让这个变量等于6((a=6))。 这个例子的let表达式包含三个元素:变量(a),要赋予变量的值6,以及程序主体(M)。 我将这条let表达式写成下面的样子: [ ({let} ; a ; 6 ; M) ] 一般地,定义let表达式为如下形式: [ ({let} ; X ; N ; M) ] 这是一个单变量的let表达式。

还是掷骰子的例子。 避免魔术数字还有一种方法是定义一个函数,函数的参数是骰子的面数(a),函数体是程序主体(M): [ lambda a.M ] 然后以参数6调用这个函数: [ (lambda a.M ; 6) ] 将上面这个表达式与let表达式对比,可以看到let表达式不过是函数调用的语法糖: [ ({let} ; X ; N ; M) = (lambda X.M ; N) ] 基于尽量简单的原则,我不打算将let表达式加入到解释器的语法中, 而是让let表达式以宏的形式加入语言。 所以另外写了一个函数translate来展开let表达式。

解释器先调用translate做转换,再调用value-of求值。