简单易懂的程序语言入门小册子(3):基于文本替换的解释器,let表达式,布尔类型,if表达式...
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求值。
布尔类型
加入布尔类型可以像加入整数一样,定义布尔类型为基本类型,然后定义几个和布尔类型相关的表达式。 不过基于“以玩的心态写代码”的原则,我打算折腾一下,用编码的方式引入布尔类型。
可以说,布尔类型唯一的用途就是用于选择(二选一)。可以将真(true)理解为一个“两个中选择第一个”的函数,将假(false)理解为一个“两个中选择第二个”的函数。如下定义布尔类型: \begin{eqnarray*} {true} &=& \lambda x.\lambda y.x \\ {false} &=& \lambda x.\lambda y.y \end{eqnarray*}
为了将整数类型和布尔类型联系起来,需要添加一个判断一个整数是否为零的基本函数iszero。 \begin{eqnarray*} M, N, L &=& ... \\ &|& ({iszero} \; b) \end{eqnarray*} iszero的求值过程: \begin{eqnarray*} eval(({iszero} \; 0)) &=& {true} \\ eval(({iszero} \; b)) &=& {false}, 其中b \neq 0 \end{eqnarray*} 代码:
if表达式
if表达式定义为: \[ ({if} \; L \; M \; N) = ((L \; M) \; N) \]
上面if表达式的定义在call-by-value的调用方式会有问题。 在call-by-value的调用方式下,不论\(L\)的值是真是假,\(M\)和\(N\)都会被求值。 这不仅造成了多余的计算,在一些情况下会很悲剧: 如果\(M\)或者\(N\)有副作用(后面会加入一些有副作用的表达式),很可能会导致结果不正确; 如果这个if表达式在一个递归函数的函数体里,那么调用这个递归函数会无限循环。
为了避免\(M\)和\(N\)被提前求值,这里用一个技巧来延后\(M\)和\(N\)的求值。 将if表达式的定义改为: \begin{eqnarray*} ({if} \; L \; M \; N) &=& (((L \; \lambda X.M) \; \lambda X.N) \; 0) \\ &&其中X \notin FV(M) \cup FV(N) \end{eqnarray*} 将\(M\)和\(N\)封装成\(\lambda X.M\)和\(\lambda X.N\),避免了\(M\)和\(N\)被求值。 等到\(L\)的真假值被求出并选择了\(\lambda X.M\)或\(\lambda X.N\)中的一个后, 将其应用到参数0上(0是随便选的,反正\(X\)这个参数在函数体\(M\)和\(N\)里也用不着)。 这个技巧在很多call-by-value的语言中用来模拟惰性求值。
和let表达式一样,if表达式以宏的形式加入到语言中。 Call-by-name的解释器:
Call-by-value的解释器:
转载于:https://www.cnblogs.com/skabyy/p/3674631.html
简单易懂的程序语言入门小册子(3):基于文本替换的解释器,let表达式,布尔类型,if表达式...相关推荐
- 学生开python语言课程_【免费下载】公开课Python 程序语言入门 教案
公开课: Python 程序语言入门 教学的目的与要求: · 让学生了解什么是编程及对编程提起浓厚的学习兴趣: · Python Shell . GUI 和 Prompt (提示符)的理解: · 学会 ...
- 【Python入门教程】第09篇 基本数据类型之布尔类型
本篇将会介绍 Python 中的布尔数据类型,以及真值和假值. 布尔数据类型 在编程过程中,我们经常需要检查某个条件是否为真(成立),然后基于这个结果执行某些操作. Python 提供了布尔(bool ...
- Go 语言 入门 基于 GoLand 2023.1 创建第一个Go程序
文章目录 Go 语言 入门 go 语言是什么? go 入门 需要 学习 什么? Go 语言有 那些优势? Go 语言 与 Java 语言 对比 Go 语言 与Python 语言 对比 Go 语言 基于 ...
- c++程序设计(第三版) pdf_【好课传送】C++语言程序设计基础入门视频
[机器学习之美导读]C/C++语言发展至今已有40多年的历史,在全世界应用非常广泛,是主流的开发语言. C/C++体系语言是IT工程师长远发展的首选,具备C++背景的工程师被互联网IT后端团队认定为团 ...
- Java程序员Go语言入门简介
引用:Java程序员Go语言入门简介 为什么是 Go 语言 类 C 的语法,这意味着 Java.C#.JavaScript 程序员能很快的上手 有自己的垃圾回收机制 跨平台.编译即可执行无需安装依赖环 ...
- c语言如何输入汉字_C语言入门的第一个小程序
大部分程序员入门的第一个小程序都是Hello World,还记得当时大一的时候,我室友还特意为了这个发了个说说,现在想起来好有意思,哈哈好了废话不多说,直接干. (PS:如果学过自动忽略) #incl ...
- c语言过程化程序设计方法,程序的设计基础(C语言入门及编程环境)(修改).ppt
程序的设计基础(C语言入门及编程环境)(修改) 程序设计基础(一) --算法 教学目的 复习语言及程序 了解算法的概念 掌握结构化程序的三种基本结构及算法的表示方法 教学重点和难点 重点:算法的表示方 ...
- 明解C语言入门篇_第8章_动手编写各种程序吧
前言 本文为业余学习<明解C语言入门篇>的记录,包含代码清单和练习题. 开始学习时间:2022年8月21日 +++++++++++++++++++++++++++++++ 第1章 初识C语 ...
- 明解C语言入门篇_第4章_程序的循环控制
前言 本文为业余学习<明解C语言入门篇>的记录,包含代码清单和练习题. 开始学习时间:2022年8月21日 +++++++++++++++++++++++++++++++ 第1章 初识C语 ...
最新文章
- 生活很急躁,史前也一样
- 产品经理一定要懂得“借力”
- python 底层原理_Python 探针实现原理
- 使用证书创建数据库镜像
- 用好String、String[]和char[]真香(洛谷P1179题题解,Java语言描述)
- 文字 竖排居中_学会了这几招,瞬间就搞定PPT文字排版问题!
- oracle-day1
- 2008年下半年软考在即 51CTO将实时提供试题和参考答案
- sql 183. 从不订购的客户
- python网络数据采集 第二版_Python网络数据采集 第2版(Python Web Scraping 2017) 完整pdf原版...
- windows MYSQL 安装及修改root密码
- 字符串拼接的sql注入实战
- php字符串函数(1)长度计算、查找、截取
- python将xls格式转成xlsx格式
- 超级炫酷的3D旋转美女图——Python实现
- 零基础入门CV之街道字符识别----Task1赛题的理解
- 什么是股票配资app?
- 爬取网页表格到Excel ?别再复制粘贴了,太慢!
- 服务降级(服务回退)
- CAD打印文字不显示怎么办
热门文章
- python集合的练习
- 【matlab】元胞数组(使用celldisp显示元胞数组)
- 【视频】TFLearn深度学习库,20行Python代码实现情感分类
- Python ln_虚拟机中单机Spark (Python版)安装
- java中if结构用图表示_Java if语句结构和指令流水线
- 基于W5300和FPGA的实时数据采集系统设计
- 计算机组成原理实验存储器部件实验,计算机组成原理实验_存储器部件教学实验...
- python【第三篇】迭代器、生成器、闭包
- ValueError: No JSON object could be decoded
- 检测表单是否合法,为什么不能用n++的探讨