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表达式...相关推荐

  1. 学生开python语言课程_【免费下载】公开课Python 程序语言入门 教案

    公开课: Python 程序语言入门 教学的目的与要求: · 让学生了解什么是编程及对编程提起浓厚的学习兴趣: · Python Shell . GUI 和 Prompt (提示符)的理解: · 学会 ...

  2. 【Python入门教程】第09篇 基本数据类型之布尔类型

    本篇将会介绍 Python 中的布尔数据类型,以及真值和假值. 布尔数据类型 在编程过程中,我们经常需要检查某个条件是否为真(成立),然后基于这个结果执行某些操作. Python 提供了布尔(bool ...

  3. Go 语言 入门 基于 GoLand 2023.1 创建第一个Go程序

    文章目录 Go 语言 入门 go 语言是什么? go 入门 需要 学习 什么? Go 语言有 那些优势? Go 语言 与 Java 语言 对比 Go 语言 与Python 语言 对比 Go 语言 基于 ...

  4. c++程序设计(第三版) pdf_【好课传送】C++语言程序设计基础入门视频

    [机器学习之美导读]C/C++语言发展至今已有40多年的历史,在全世界应用非常广泛,是主流的开发语言. C/C++体系语言是IT工程师长远发展的首选,具备C++背景的工程师被互联网IT后端团队认定为团 ...

  5. Java程序员Go语言入门简介

    引用:Java程序员Go语言入门简介 为什么是 Go 语言 类 C 的语法,这意味着 Java.C#.JavaScript 程序员能很快的上手 有自己的垃圾回收机制 跨平台.编译即可执行无需安装依赖环 ...

  6. c语言如何输入汉字_C语言入门的第一个小程序

    大部分程序员入门的第一个小程序都是Hello World,还记得当时大一的时候,我室友还特意为了这个发了个说说,现在想起来好有意思,哈哈好了废话不多说,直接干. (PS:如果学过自动忽略) #incl ...

  7. c语言过程化程序设计方法,程序的设计基础(C语言入门及编程环境)(修改).ppt

    程序的设计基础(C语言入门及编程环境)(修改) 程序设计基础(一) --算法 教学目的 复习语言及程序 了解算法的概念 掌握结构化程序的三种基本结构及算法的表示方法 教学重点和难点 重点:算法的表示方 ...

  8. 明解C语言入门篇_第8章_动手编写各种程序吧

    前言 本文为业余学习<明解C语言入门篇>的记录,包含代码清单和练习题. 开始学习时间:2022年8月21日 +++++++++++++++++++++++++++++++ 第1章 初识C语 ...

  9. 明解C语言入门篇_第4章_程序的循环控制

    前言 本文为业余学习<明解C语言入门篇>的记录,包含代码清单和练习题. 开始学习时间:2022年8月21日 +++++++++++++++++++++++++++++++ 第1章 初识C语 ...

最新文章

  1. 生活很急躁,史前也一样
  2. 产品经理一定要懂得“借力”
  3. python 底层原理_Python 探针实现原理
  4. 使用证书创建数据库镜像
  5. 用好String、String[]和char[]真香(洛谷P1179题题解,Java语言描述)
  6. 文字 竖排居中_学会了这几招,瞬间就搞定PPT文字排版问题!
  7. oracle-day1
  8. 2008年下半年软考在即 51CTO将实时提供试题和参考答案
  9. sql 183. 从不订购的客户
  10. python网络数据采集 第二版_Python网络数据采集 第2版(Python Web Scraping 2017) 完整pdf原版...
  11. windows MYSQL 安装及修改root密码
  12. 字符串拼接的sql注入实战
  13. php字符串函数(1)长度计算、查找、截取
  14. python将xls格式转成xlsx格式
  15. 超级炫酷的3D旋转美女图——Python实现
  16. 零基础入门CV之街道字符识别----Task1赛题的理解
  17. 什么是股票配资app?
  18. 爬取网页表格到Excel ?别再复制粘贴了,太慢!
  19. 服务降级(服务回退)
  20. CAD打印文字不显示怎么办

热门文章

  1. python集合的练习
  2. 【matlab】元胞数组(使用celldisp显示元胞数组)
  3. 【视频】TFLearn深度学习库,20行Python代码实现情感分类
  4. Python ln_虚拟机中单机Spark (Python版)安装
  5. java中if结构用图表示_Java if语句结构和指令流水线
  6. 基于W5300和FPGA的实时数据采集系统设计
  7. 计算机组成原理实验存储器部件实验,计算机组成原理实验_存储器部件教学实验...
  8. python【第三篇】迭代器、生成器、闭包
  9. ValueError: No JSON object could be decoded
  10. 检测表单是否合法,为什么不能用n++的探讨