13.1函数式编程语言简介 例1 letrec x =2; f==入八.x+Jy; F==入gx.g2 in Ff1 一静态作用域,结果等于4 {x:2,f:入.x+y,F:gx.g2}是表达式2,Jyx+ 入gx.g2和Ff1的计算环境 表达式e和它的计算环境u形成二元组(e,w),叫做 闭包。环境u用来保证e中的自由变量会被正确地 解释,因此环境u和变元需要一起传递
13.1 函数式编程语言简介 • 例1 letrec x == 2; f == y. x + y; F == g x. g2 in F f 1 – 静态作用域,结果等于4 – {x :2, f : y. x + y, F : g x. g2}是表达式2, y.x+y, g x. g2和F f 1的计算环境 – 表达式e和它的计算环境u形成二元组(e, u),叫做 闭包。环境u用来保证e中的自由变量会被正确地 解释,因此环境u和变元e需要一起传递
13.1函数式编程语言简介 例2 letrec comp==入f.入g.入x.f(gx); F==入x..; G==入乙.…; h==comp FG inh(.)+F(.)+G(.) - 函数可以作为函数的变元 一函数也可以作为函数的结果 - n元函数可作为高阶函数使用,当作用于m(m<n) 个变元时,结果是一个(n-m)元的函数
13.1 函数式编程语言简介 • 例2 letrec comp == f .g. x. f (gx); F == x. …; G == z. …; h == comp F G in h( ... ) + F( ... ) + G( ... ) – 函数可以作为函数的变元 – 函数也可以作为函数的结果 – n元函数可作为高阶函数使用, 当作用于m (m < n) 个变元时,结果是一个( n − m )元的函数
13.1函数式编程语言简介 13.1.3变量的自由出现和约束出现 在letrec1=e12元e2.…V。=eime中,等号 左边的y1,,n是这些变量的定义性出现 在入W.Vn-e的M.Vn中的y1,,n是这些变量的 定义性出现 变量出现在其它地方都是引用性出现 引用性出现分成自由出现和约束出现 在(入x.(.x+)+乙))x中, 自由出现的变量:x,乙 约束出现的变量:x,,乙
13.1 函数式编程语言简介 13.1.3 变量的自由出现和约束出现 – 在letrec v1== e1 ; v2== e2 ; . . . vn== en in e0中,等号 左边的v1 , …, vn是这些变量的定义性出现 – 在v1 … vn .e的v1 … vn中的v1 , …, vn是这些变量的 定义性出现 – 变量出现在其它地方都是引用性出现 – 引用性出现分成自由出现和约束出现 在 (x y. (z. x + z) (y + z ) ) x中, 自由出现的变量:x, z 约束出现的变量:x, y, z
13.2函数式语言的编译简介 概述 -将按需调用语义和静态约束的函数式语言SFP的 程序编译成FAM的机器语言 AM是一种抽象机,它有一个栈,生存期符合栈 式管理的所有变量都分配在栈中;它还有一个堆! 所有其它的变量都存在堆中 先用一连串的例子来启发后面从SFP程序到FAM 程序的编译描述
13.2函数式语言的编译简介 • 概述 – 将按需调用语义和静态约束的函数式语言SFP的 程序编译成FAM的机器语言 – FAM是一种抽象机,它有一个栈,生存期符合栈 式管理的所有变量都分配在栈中;它还有一个堆, 所有其它的变量都存在堆中 – 先用一连串的例子来启发后面从SFP程序到FAM 程序的编译描述
13.2函数式语言的编译简介 13.2.1几个受启发的例子 例1 1+2 -本表达式的结果是基值类型,可以放在栈上 但是表达式结果也可能是函数,它不能放在栈上 统一做法: 把程序表达式的结果统一存放在堆中,在栈顶用 一个指针指向堆中的结果
13.2函数式语言的编译简介 13.2.1 几个受启发的例子 例1 1 + 2 – 本表达式的结果是基值类型,可以放在栈上 – 但是表达式结果也可能是函数,它不能放在栈上 – 统一做法: 把程序表达式的结果统一存放在堆中,在栈顶用 一个指针指向堆中的结果