安德烈亚斯·阿贝尔 沙赫努尔·伊桑达利 安德烈亚斯·洛夫 纳奇亚潘-瓦利亚潘 WASDi公司 亚历山大·库尔兹[#11] 科索罗斯[#12][#13]
SDecl公司。 Stm::=类型Id“;”; SDecls公司。 Stm::=类型Id“,”[Id]“;”;
SDecls公司。 Stm::=类型[Id]“;”;
分隔符非空Id“,”;
Γ⊢s ⇒ Γ'
返回 【a】 以下为: t) + 【b】 以下为: t) 以下为: t)
除非(典型2 == 典型值) $ 失败 $
" 的类型 " ++ ...
检查Stm :: 环境 -> Stm公司 -> 错误 环境 checkStm环境 = 案例 秒 属于
SExp公司 经验 -> 做 推断Exp环境 经验
返回 环境 SDecl公司 典型x -> updateVar env x类型 S同时 经验 stm公司 -> 做 checkExp环境 类型库(_B) 经验 checkStm(newBlock env)stm 返回 环境
γ⊢s ⇓ ⟨ r、 γ'⟩
整数 x个 = 0 ; 整数 年 = 0 ; 虽然 ( x个 ++ < 1 ) 整数 年 = 1 ; 返回 年 ;
迭代语句是一个块,其范围是 其封闭块的范围。 循环体也是块 其作用域是迭代作用域的严格子集 声明。 (第6.8.5节第5句,第135页,绝对值第147页)
整数 年 = 0 ; 如果 ( 1 ) 整数 年 = 1 ; 其他的 整数 年 = 2 ; 返回 年 ;
第134页:有两种环境(即分离函数和变量)是 需要 处理递归定义:显然,作者忘记了可以有循环数据结构(可以用Haskell等惰性语言直接实现,也可以用Java等变量+引用实现)。 (旁注:提到的另一个动机是,应该分离函数和变量以节省内存,但是否节省内存取决于环境的表示方式(例如,考虑链接列表与基于树的地图数据结构)。)
TAll kind=父母(“\\p->和[p x | x<-”++kind++“]”); TAny kind=父母(“\\p->或[p x | x<-”++kind++“]”);
dcmpg,dcmpl:获取并比较堆栈中最顶层的两个双精度数。 如果第一个值大于第二个值,则堆栈上剩余的值为1, 如果它们相等,则为0;如果第一个值小于第二个值,则为-1。 只有当其中一个双精度数是NaN(不是数字)时,操作才会不同。 然后dcmpg离开1,dcmpl-1。