【PL理论深化】(17) 文法构造:形式参数 | 实质参数 | 主体表达式 | let 表达式可被函数替换 | 提高编程的便利性 —— “语法糖“ (Syntactic sugar)

💬 写在前面:本章将扩展上一章的语言,以便能够定义和使用函数。

目录

0x00 文法构造

0x01 编写几个示例

0x02 let 表达式可被函数替换

0x03 提高编程的便利性 —— 语法糖(Syntactic sugar)


0x00 文法构造

在程序中使用函数需要支持两种方法:创建函数和调用函数。

为此,我们扩展了语言的语法结构,如图所示:

在现有语言的基础上,增加了最后两种情况 (函数创建表达式和函数调用表达式) 。

定义一个函数的语法,这个函数接收 x 作为参数并返回 E 的计算结果:

\textrm{fun}\, \, x\, \, E

在这个语法中,x 被称为 形式参数 (formal parameter)  ,简称形参。

E 被称为函数的 主体表达式 (body expression) 。

.

参数 x 的值只能在主体 E 中使用,函数调用通常采用 E_1,E_2 的形式

其中 E_1 是计算要调用的函数的表达式,而 E_2 是计算函数参数的表达式。

E_2 的值被称为 实际参数(actual parameter),简称实参。

.

0x01 编写几个示例

以下使用这种语言编写的程序示例:

fun x (x+1)

表示一个接收参数 x 并返回 x+1 值的函数。

.

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

函数体中可以包含任意的表达式。

在这种情况下,使用 let 表达式将 x+1 称为 y,然后返回条件表达式的结果。

.

fun x (fun y (x+y)) 

表示函数体中包含了另一个函数的定义,它表示接收参数 x 并返回函数 \textrm{fun }y (x+y) 的函数。

.

fun f (f 1) 

表示将另一个函数作为参数传递的情况。

它表示接收一个函数 f 作为参数,并返回调用该函数(传入参数 1)的结果。

.

let f = fun x (x+1) in (f 2)

和其他值一样,函数也可以命名。

将函数 \textrm{fun} \, x (x+1) 命名为 f,然后用实际参数 2 调用 f 的程序,结果值是 3。

.

let f = fun x (x+1) in (f (f 2))

函数调用表达式 (E_1\, E_2) 中,E_1 和 E_2 可以是任意的表达式。

在这个例子中,函数调用表达式 \big(f (f 2)\big)E_2 是另一个函数调用表达式 (f 2) 的情况。

首先计算 (f 2),然后将结果作为参数再次调用函数 f,所以最终结果值是 4。

.

(fun f (f (f 2)) fun x (x+1))

在这个例子中,在函数调用表达式中:

E_1 位置直接使用了函数生成式 \textrm{fun}\, f\big(f\, (f\, 2)\big)\,

E_2 位置也使用了函数生成式 \textrm{fun }x (x+1)

该函数被作为参数传递给 f 并被调用两次,计算结果是 4。

.

let f = fun x (fun y (x+y)) in ((f 3) 4)

在这个例子中,函数 f 可以解释为接受参数 x 和 y,并返回它们的和 x+y 的函数。

在表达式 \big((f 3) 4\big) 中,将参数 3 和 4 分别传递给 xy,调用了函数 f,结果为 7。

.

如上图所示,不难看出,在上图中的语言中,可以非常自由地使用函数。

可以将函数存储在变量中,将其作为另一个函数的参数传递,

并且还可以将其作为另一个函数的返回值。这种语言支持高阶函数,类似于 OCaml。

0x02 let 表达式可被函数替换

顺便一提,如果编程语言支持函数,那么 let 表达式就不再是必需的了。

这是因为可以将任意的 let 表达式转换为等效的函数调用表达式。

可以利用下面这种 E_1 和 E_2 的任意关系来实现这一点:

\textrm{let } x = E_1\, \, \textrm{in} \, \, E_2\, \, \equiv \, \, (\textrm{fun } x \, E_2) E_1

比如下面程序:

let f = fun x (x+1)
in (f (f 2))

具有与以下程序相同的含义,即通过函数调用实现:

(fun f (f (f 2)) fun x (x+1))

.

0x03 提高编程的便利性 —— 语法糖(Syntactic sugar)

尽管可以用其他语法来表达类似 let 语法的结构。

但为了编程的便利,编程语言提供的语法称为 语法糖 (Syntactic sugar)。

OCaml 提供的函数定义语法也是一种语法糖,例如下面的 OCaml 程序:

let square x = x * x in
  let add x y = x + y in
    (add 1 (square 2))

可以用下图中的语法结构来表示:

let square = fun x (x * x) in
  let add = fun x (fun y (x + y)) in
    (add 1 (square 2))

语法糖(Syntactic sugar)是计算机科学中的一个概念,指的是编程语言中添加的语法特性,它并不会增加语言的功能,但可以使代码更易读、更简洁,从而提高开发效率。

语法糖是指一种语法上的改进,它使得程序的编写更加方便和易于理解,但实际上并没有引入新的功能。这些改进通常通过编译器或解释器转换为更基础的语法结构,这些基础结构本身就能实现相同的功能,只是不如语法糖那样简洁易懂。

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

📜 参考资料 

- 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

  • 41
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

王平渊

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

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

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

打赏作者

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

抵扣说明:

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

余额充值