💬 写在前面:本章将扩展上一章的语言,以便能够定义和使用函数。
目录
0x03 提高编程的便利性 —— 语法糖(Syntactic sugar)
0x00 文法构造
在程序中使用函数需要支持两种方法:创建函数和调用函数。
为此,我们扩展了语言的语法结构,如图所示:
在现有语言的基础上,增加了最后两种情况 (函数创建表达式和函数调用表达式) 。
定义一个函数的语法,这个函数接收 作为参数并返回
的计算结果:
在这个语法中, 被称为 形式参数 (formal parameter) ,简称形参。
而 被称为函数的 主体表达式 (body expression) 。
.
参数 的值只能在主体
中使用,函数调用通常采用
的形式
其中 是计算要调用的函数的表达式,而
是计算函数参数的表达式。
的值被称为 实际参数(actual parameter),简称实参。
.
0x01 编写几个示例
以下使用这种语言编写的程序示例:
fun x (x+1)
表示一个接收参数 并返回
值的函数。
.
fun x (let y = x+1 in if iszero y then x else y)
函数体中可以包含任意的表达式。
在这种情况下,使用 let 表达式将 称为
,然后返回条件表达式的结果。
.
fun x (fun y (x+y))
表示函数体中包含了另一个函数的定义,它表示接收参数 并返回函数
的函数。
.
fun f (f 1)
表示将另一个函数作为参数传递的情况。
它表示接收一个函数 作为参数,并返回调用该函数(传入参数 1)的结果。
.
let f = fun x (x+1) in (f 2)
和其他值一样,函数也可以命名。
将函数 命名为
,然后用实际参数 2 调用
的程序,结果值是 3。
.
let f = fun x (x+1) in (f (f 2))
函数调用表达式 中,
和
可以是任意的表达式。
在这个例子中,函数调用表达式 是
是另一个函数调用表达式
的情况。
首先计算 ,然后将结果作为参数再次调用函数
,所以最终结果值是 4。
.
(fun f (f (f 2)) fun x (x+1))
在这个例子中,在函数调用表达式中:
位置直接使用了函数生成式
位置也使用了函数生成式
该函数被作为参数传递给 并被调用两次,计算结果是 4。
.
let f = fun x (fun y (x+y)) in ((f 3) 4)
在这个例子中,函数 可以解释为接受参数
和
,并返回它们的和
的函数。
在表达式 中,将参数 3 和 4 分别传递给
和
,调用了函数
,结果为 7。
.
如上图所示,不难看出,在上图中的语言中,可以非常自由地使用函数。
可以将函数存储在变量中,将其作为另一个函数的参数传递,
并且还可以将其作为另一个函数的返回值。这种语言支持高阶函数,类似于 OCaml。
0x02 let 表达式可被函数替换
顺便一提,如果编程语言支持函数,那么 let 表达式就不再是必需的了。
这是因为可以将任意的 let 表达式转换为等效的函数调用表达式。
可以利用下面这种 和
的任意关系来实现这一点:
比如下面程序:
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 |