Coursera Programming Languages, Part A 华盛顿大学 Week 1
博客园,我又回来啦!
Static & Dynamic environment
在ML语言中,每当出现一个新的语句,我们都用现存的 Static / Dynamic Environment 对它进行 type-check / Evaluate。
只有通过 type-check 的语句才不会出现错误。
Value 是一种无需再进行计算处理的表达 (Expression),它 Evaluate 后的值就是它本身。
很重要的一个概念:
All the values are expressions. Not all the expressions are values.
Variable Bindings
- ML语言采用的是所谓 Binding Statement, 而不是其他语言中常见的 assignment statement。这意味着ML语言中的变量有着 immutable 的性质。
syntax:
val x = e;
Function Bindings
syntax:
fun x0(x1 : t1, x2 : t2, ..., xn : tn) = e
-
当对一个 Function binding 进行 type-checking 时,使用 current static environment 与新的
x0 : t1 * t2 * ... * tn -> t
(function type) 与x1 : t1, x2 : t2, ... xn : tn
来type-check 函数的主体 (function body) e. 整个函数的返回类型 (result type) 必须同 e 的类型相符。可以发现,虽然我们没有直接声明 e 的类型,程序却能够识别出来。这与 ML 语言的 type inference 特性有关。而在对 current static environment 进行更新时,我们只加入x0 : t1 * t2 * ... * tn -> t
,而对于参数x1 : t1, ..., xn : tn
, 它们是不会添加至 top-level static environment 中的。它们只会在函数的主体中被使用。 (有点类似于函数的局部变量?的感觉) -
对于一个 Function binding 的 evaluate 过程则比较简单。直接将 x0 加入到 dynamic environment 中即可。这是因为 \(A function is a value.\)
-
注意到当对函数进行调用的时候 (function call) 时,函数 x0 已经存在于 dynamic environment 中,这使得对函数的递归调用 (recursive call) 成为可能。
Pairs and other tuples
(e1, e2) : t1 * t2
#1 pr = v1
#2 pr = v2
Tuple : 可以以有超过两个元素的形式存在。
Lists
[e1, e2, ..., en] which all es has type t : e list
_e :: [] = [_e] (*添加*)
null [] == true
hd [1, 2, 3] = 1
tl [1, 2, 3] = [2, 3]
(*当 list 为空时,hd tl 函数抛出异常*)
Let expressions
syntax:
let b1 b2 ... bn in e end
(*每一个 bi 都是一个 binding*)
- 创建局部变量的重要形式。当 Let expressions 中的 bindings 同外部的变量重名时,Let expression 内部的变量会覆盖 (shadows) 外部的变量。
- Let expression 的 type 与 e 的 type 符合
Option
ML 库中一种特殊的数据类型专门用来处理返回为空 (NONE) 的情况。
NONE : 'a option (*空*)
SOME e : t option which e has type t
isSome a (*如果是 NONE 返回 false 否则返回 true *)
valOf a (*返回 option 类型中的值,如果是 NONE 抛出一个异常*)
Lack of mutation and benefits thereof
ML 语言变量的 immutable 特性使得虽然存在 alias,但我们完全不用考虑其改变带来的影响。 (C++好像也是?但 python 中的某些类型就需要考虑 alias 的影响,很烦)
Java 中 alias 可变的现象使得需要特别对其注意,有时需要创建一个复制 (copy) 来避免 alias 带来的影响。
Some odds and ends
andalso (* && *)
orelse (* || *)
not (* ! *)
<> (* != *)
@ (* to concatenate two lists *)
^ (* to concatenate two strings *)
Int.toString (* int compulsorily convert to string *)
Language pieces
在学习任何一门编程语言时,对于其语言构造 (construction),我们都可以从一下五个方面来审视
- Syntax (语法)
- Semantics (语义,如 type-checking rules and evaluation rules)
- Idioms (一些约定俗成的用法)
- Libraries (内置函数,标准库等等)
- Tools (语言之外的工具,如 编译器,REPL环境,debuggers)
Homework 1 :
coursera有规定,不能公开上传代码,所以只能加密一下
这里