【PL理论深化】(13) 变量与环境:文法结构 | 真假表达式:isZero E | let 表达式叠放 | 定义的规则 | 条件语句的使用

💬 写在前面:从现在开始,让我们正式设计和实现编程语言。首先,让我们扩展在之前定义的整数表达式语言,以便可以使用变量和条件表达式。

目录

0x00 文法结构

0x01 真假表达式:isZero E

0x02 let 表达式叠放

0x03 定义的规则

0x04 条件语句的使用


0x00 文法结构

扩展后的语言的文法结构如下,在整数表达式语言中增加了四种文法:

在程序中,可以在任意可以出现表达式的位置使用变量 x (随机变量)

let x = E_1 in E_2 是一个声明变量 x 的表达式。

它先将 E_1 的值赋给 x,然后计算 E_2 的值。在此期间,变量 x 的有效范围是 E_2

if E_1 then E_2 else E_3  是一个条件表达式,其计算方式如下。

.

此后,我们约定符号 \top 表示 true,符号 \bot 表示 false。

首先计算表达式 E_1,其结果必须是 \perp 或 \top

  • 如果 E_1 的值是 \top,则计算 E_2
  • 如果 E_1 的值是 \bot,则计算 E_1

0x01 真假表达式:isZero E

为了使用条件表达式,需要创建产生 真/假 的表达式,因此我们添加了语法:

\textrm{iszero}\,\, E

它计算表达式 E 的值,如果值为 0,则计算为 \top,否则为 \bot

由于它类似于 OCaml 的语法,可以很容易感受到可以编写哪些程序,举几个例子:

下面是一个程序,首先变量 x:= 1,然后计算 x+2 的值,结果是 3

let x = 1 in x + 2

0x02 let 表达式叠放

在 let 表达式的 E_2 位置上可以放置另一个 let 表达式

let x = 1
in let y = 2
  in x + y

表达式 x+y 中,x 和 y 分别代表 1 和 2,因此程序的计算结果是 3。

.

也可以在 let 表达式的 E_1 位置上放置另一个 let 表达式,如下所示。

let x = let y = 2
        in y + 1
in x + 3

表达式 let y = 2 in y + 1 的值为 3,将其命名为 x 后,计算表达式 x+3 的结果为 6。

在计算表达式 x+3 时,请注意变量 y 不可用。

变量 y 的作用范围仅限于表达式 y+1,因此在其他地方无法使用。

因此,下面的程序在语法上没有问题,但在执行时会出现问题。

let x = let y = 2
        in y + 1
in x + y

0x03 定义的规则

可以多次使用相同的名称进行定义,如下所示。

let x = 1
in let y = 2
    in let x = 3
        in x + y

在最后一行计算 x+y 时,x 表示最后定义的值 3,因此 x+y 的值是 5。

重新定义具有相同名称的变量并不会改变先前变量的值。

使用 let 定义变量并不是修改现有变量的值,而是创建一个新名称,在其作用域内具有意义。

例如下面的程序:

let x = 1
in let y = let x = 2
           in x + x
    in x + y

上述程序计算的结果是 5。第一行定义变量 x:= 1,第二行定义的 x:= 2

因此第三行的 x+x 的值是 4,因此变量 y 的值为 4。

在最后一行的表达式 x+y 中,变量 x 指的是第一行定义的 x,因此 x+y 的值为 5。

0x04 条件语句的使用

条件语句的使用如下所示。这是一个计算整数 1 的程序。

let x = 1
in let y = 2
    in if iszero (x - 1) then y - 1 else y + 1

.

现在,由于程序不仅可以计算整数,还可以计算真 / 假值,因此存在一些由于类型不匹配而无法执行的程序,即存在 类型错误 (type error) 的程序。例如,看下面的程序。

let x = 1
in let y = iszero x
    in x + y

加法是针对两个整数定义的操作,但由于 y\in \left \langle bool \right \rangle,因此在计算 x+y 时会发生类型错误。

由于我们的语言目前没有静态类型系统,所以无法在执行前发现这类类型错误。

如果在运行过程中发生类型错误,程序将会因此而非正常终止。

📌 [ 笔者 ]   王亦优
📃 [ 更新 ]   2022.9.14
❌ [ 勘误 ]   /* 暂无 */
📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,
              本人也很想知道这些错误,恳望读者批评指正!

📜 参考资料 

- R. Neapolitan, Foundations of Algorithms (5th ed.), Jones & Bartlett, 2015.

- T. Cormen《算法导论》(第三版),麻省理工学院出版社,2009年。

- T. Roughgarden, Algorithms Illuminated, Part 1~3, Soundlikeyourself Publishing, 2018.

- J. Kleinberg&E. Tardos, Algorithm Design, Addison Wesley, 2005.

- R. Sedgewick&K. Wayne,《算法》(第四版),Addison-Wesley,2011

- S. Dasgupta,《算法》,McGraw-Hill教育出版社,2006。

- S. Baase&A. Van Gelder, Computer Algorithms: 设计与分析简介》,Addison Wesley,2000。

- E. Horowitz,《C语言中的数据结构基础》,计算机科学出版社,1993

- S. Skiena, The Algorithm Design Manual (2nd ed.), Springer, 2008.

- A. Aho, J. Hopcroft, and J. Ullman, Design and Analysis of Algorithms, Addison-Wesley, 1974.

- M. Weiss, Data Structure and Algorithm Analysis in C (2nd ed.), Pearson, 1997.

- A. Levitin, Introduction to the Design and Analysis of Algorithms, Addison Wesley, 2003. - A. Aho, J. Hopcroft, and J. Ullman, Data Structures and Algorithms, Addison-Wesley, 1983.

- E. Horowitz, S. Sahni and S. Rajasekaran, Computer Algorithms/C++, Computer Science Press, 1997.

- R. Sedgewick, Algorithms in C: 第1-4部分(第三版),Addison-Wesley,1998

- R. Sedgewick,《C语言中的算法》。第5部分(第3版),Addison-Wesley,2002

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王平渊

喜欢的话可以支持下我的付费专栏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值