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有规定,不能公开上传代码,所以只能加密一下
这里

posted @ 2022-03-14 22:18  四季夏目天下第一  阅读(47)  评论(0编辑  收藏  举报