Coursera课程 Programming Languages, Part B 总结
碎言碎语
- 很多没有写过 Lisp 程序的人都会对 Lisp 中的括号产生偏见(包括曾经第一次看到 Lisp 程序的我),事实上,括号赋予 Lisp 的是严谨的程序结构,Lisp 中的括号是极其严格的,往往既缺一不可,也不能画蛇添足。括号往往意味着表达式的计算,例如
(e)表示 e 表达式的计算,那么一旦 e 是一个确定的值,则会出现问题,(3),在 Racket 中会报错:application: not a procedure;。 - 这门课最值得一提的就是 week 2 的作业,在 Racket 语言中实现自己的语言 MUPL(Made Up Programming Language),Racket 作为解释器去执行用自己的语言写成的代码。当然话是这么说,其实介绍作业的材料已经解决了从 0 到 1 的困难了,从定义语言的基本语法,到扩展这门语言,再到用这门语言编写函数,都有着详细的指导。
- Racket 作为解释器,如果要执行我们的语言,简单情况下,只需要编写一个 eval 函数,里面充满着各种判断语句来解析我们的语言(语法)。另外,我们可以在自己的语言中定义宏的写法,其实这里宏可以就是一个 Racket 函数,这个函数会返回一个 MUPL 表达式,在 eval 函数执行的时候可以很自然的替换,这不是很类似 Racket 语言中的宏吗?检测宏是否运行正常只要看它生成的代码是否正确就行了。
- 从类型检查谈起,并讨论了弱类型语言以及强类型语言的区别(如 C 的数组越界),并在某些方面比较了动态类型和静态类型的优缺点。在 Racket 中我们仅仅使用 list 就定义出很多数据结构,通过 car cdr 可以很容易的使用(如最基本的树,也可以实现 set 和 map),但是定义一个新的类型,既可以更快地帮助类型测试捕捉到这个错误,也提高了代码的可读性。
- 如果对 Part B 的内容还意犹未尽的话,还有 SICP 可以食用,前三章会看的很轻松(或许)。
笔记
1. 惰性求值(Lazy Evaluation)
- call-by-value:在调用函数时,表达式先被求值再作为参数。
- call-by-need:在需要的时候再计算。
在大多数编程语言中都是第一种方式,在一些语言中我们可以用一种既巧妙又简单的方式实现第二种方式,即惰性求值(Lazy Evaluation)。
下面举得例子并不是非常恰当,但是很直观。
Racket 中的 if 表达式是这样的:
(if e1 e2 e3)
也就是如果 e1 为真,执行 e2 否则执行 e3。很显然它接受三个参数,那么有一个问题,如果应用的是第一种方式,e1 e2 e3 先被计算再判断 e1 真假的话,一旦 e2 表达式产生了 side effect (例如打印函数),则会导致程序的不理想输出,甚至于有时会发生无限递归。
为了解决这个问题,e2 和 e3 在判断 e1 之前不能被计算。
在 Racket 语言中,我们直接在 e2 和 e3 外面分别套一个 lambda表达式 即可达到这个目的。
(define (bad-if e1 e2 e3)
(if e1 e2 e3))
(bad-if (= 1 2) (write 1) (write 3)) ; 13
(define (new-if e1 e2 e3)
(if e1 (e2) (e3)))
(new-if (= 1 2) (lambda () (write 1)) (lambda () (write 3))) ; 3
所以,如果我们想要延迟求值,把要延迟求值的表达式放到一个 lambda表达式 中即可,在需要用到时对函数求值即可。
这样问题是解决了,但是显得异常麻烦,有几个参数就要写几个 lambda表达式,有没有什么简洁的方法呢?
这个时候就要用到 宏(macro) 了。
宏的替换发生在任何表达式的计算之前。
(define-syntax good-if
(syntax-rules ()
[(new-if e1 e2 e3)
(new-if e1 (lambda () e2) (lambda () e3))]))
(define (new-if e1 e2 e3)
(if e1 (e2) (e3)))
(good-if (= 1 2) (write 1) (write 3)) ; 3
虽然这个例子毫无意义,但是思想还是能体现不少的。
惰性求值一个常见的应用就是 流(stream) 了。
具体可参考 SICP 。
2. macro
模拟 for 循环。
(define-syntax for
(syntax-rules (to do)
[(for lo to hi do body)
(let ([l lo]
[h hi])
(letrec ([loop (lambda (it)
(cond [(= it h) body]
[(< it h) (begin body (loop (+ it 1)))]))])
(loop l)))]))
(for 1 to 5 do (write "H"))
Coursera课程 Programming Languages, Part B 总结的更多相关文章
- Coursera课程 Programming Languages, Part A 总结
Coursera CSE341: Programming Languages 感谢华盛顿大学 Dan Grossman 老师 以及 Coursera . 碎言碎语 这只是 Programming La ...
- Coursera课程 Programming Languages 总结
课程 Programming Languages, Part A Programming Languages, Part B Programming Languages, Part C CSE341: ...
- Coursera课程 Programming Languages, Part C 总结
碎言碎语 和前面的 ML 和 Racket 感觉明显不一样了,一边学着一边觉得这真是一门奇怪的语言,有着各种奇怪的语法,不过真的算是一个奇妙的体验(相比前面的两门语言,Ruby 的学习资源多了不少). ...
- 【Python学习笔记】Coursera课程《Using Python to Access Web Data》 密歇根大学 Charles Severance——Week6 JSON and the REST Architecture课堂笔记
Coursera课程<Using Python to Access Web Data> 密歇根大学 Week6 JSON and the REST Architecture 13.5 Ja ...
- 【C语言】Coursera课程《计算机程式设计》台湾大学刘邦锋——Week6 String课堂笔记
Coursera课程 <计算机程式设计>台湾大学 刘邦锋 Week6 String 6-1 Character and ASCII 字符变量的声明 char c; C语言使用一个位元组来储 ...
- ESSENTIALS OF PROGRAMMING LANGUAGES (THIRD EDITION) :编程语言的本质 —— (一)
# Foreword> # 序 This book brings you face-to-face with the most fundamental idea in computer prog ...
- Coursera课程下载和存档计划[转载]
上周三收到Coursera平台的群发邮件,大意是Coursera将在6月30号彻底关闭旧的课程平台,全面升级到新的课程平台上,一些旧的课程资源(课程视频.课程资料)将不再保存,如果你之前学习过相关的课 ...
- Natural language style method declaration and usages in programming languages
More descriptive way to declare and use a method in programming languages At present, in most progra ...
- The future of programming languages
In this video from JAOO Aarhus 2008 Anders Hejlsberg takes a look at the future of programming langu ...
随机推荐
- iOS开发解决json串中的NSNull类型
后端返回的数据中总会出现一些NSNull类型,当我们一处理程序就会崩溃,因此想到把返回的数据中的NSNull类型全部转换成@""空字符串.下面是转化方法: 1 自定义的几个方法:放 ...
- spring cloud sidecar
用spring cloud sidecar的整合异构语言,以前做过没有做笔记,现在再做由于各种坑又浪费了一天,这里记一下 首先是官网:http://cloud.spring.io/spring-clo ...
- 教程:安装禅道zentao项目管理软件github上的开发版
该文章转自:吕滔博客 直接从github拉下来的禅道的源码,是跑不起来的.除非你按我的教程来做...哈哈哈(不要脸)~~~~ 禅道官网提供的版本包是带了有安装文件,并有打包合成一些css.js文件的. ...
- JavaScript循环实例
几个经典的循环案例: 1.一张纸的厚度是0.0001米,将纸对折,对折多少次厚度超过珠峰高度8848米 var i=0; var h=0.0001; while(true){ i++; h=h*2; ...
- C图形库Easyx的使用
学习Eaxy X图形库后我的成果: 花了一周时间做出并完善了Flappy Bird,目前功能如下: 1. 背景的显示 2. 加入小鸟image 3. 小鸟自由下落,按空格键/鼠标右键后上升 4. 加入 ...
- jquery $.fn $.fx是什么意思有什么用
$.fn是指jquery的命名空间,加上fn上的方法及属性,会对jquery实例每一个有效, .fn是指jquery的命名空间,加上fn上的方法及属性,会对jquery实例每一个有效. 如扩展$.fn ...
- whereis 命令详解
whereis 作用:whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b).man说明文件(参数-m)和源代码文件(参数-s).如果省略参数,则返回所有信息. 参数:-b 定位可 ...
- C#的发展已经15年了 。。。历史发展
C#是微软公司在2000年6月发布的一种新的编程语言,主要由安德斯·海尔斯伯格(Anders Hejlsberg)主持开发,它是第一个面向组件的编程语言,其源码会编译成msil再运行.它借鉴了Delp ...
- IT小白学习Discuz!框架(一)
1.Discuz!是什么? 答:(1).Crossday Discuz! Board(简称 Discuz!)是北京康盛新创科技有限责任公司推出的一套通用的社区论坛软件系统. (2).Crossday ...
- sql sever分组查询和连接查询
分组查询select 查询信息 from 表名where 条件group by 按照列分组(可多个 ,隔开)order by 排序方式(查询信息如果列名和聚合函数同时出现,要么在聚合函数中出现,要么就 ...