programming-languages学习笔记--第6部分

<?xml version="1.0" encoding="utf-8"?> programming-languages学习笔记–第6部分

programming-languages学习笔记–第6部分

1 无datatype

动态类型语言中不需要,只需要基本类型和cons.

2 Racket中的struct

(struct foo (bar baz quux) #:transparent)

3 structs的优点

定义数据类型更简洁,减少误用。

可以结合模块系统隐藏构造函数,强制不变式。

4 实现编程语言

典型的工作流:

  • 具体语法(sring): "(fn x => x + x) 4"
  • 解析器(生成ast): 发现错误/警告
  • 类型检查: 分析ast,发现错误/警告

实现一个编程语言B的方法:

  • 用另外一个语言A写一个解释器(执行器),接受一个程序B并产生结果
  • 用另外一个语言A写一个编译器(转换器),转换为语言C,转换必须保证语义等价。

称A为metalanguage

不管是解释器、编译器或两者结合,都是一个具体语言的实现,不是语言定义。 所以没有一种语言比另一种语言快的说法,是语言实现的不同。

5 Interpreter

解释器可以假定什么

合法AST:

  • 解释器必须处理的tree
  • 可以假定解构字段的类型正确
  • 不合法的AST可以导致解释器崩溃

对于解释器,metalanguage中的function可以作为解释语言的Macros.用函数接受实现语言的语法, 并返回实现语言的语法,就是宏。

6 variable and env

变量定义,环境用于映射变量到值。

7 实现闭包

env,fun

求值函数表达式:

  • 函数不是一个值,closure是一个值。 求值函数返回一个closure
  • 当函数求值时,创建一个包含函数和当前环境的closure

函数调用: (call e1 e2)

  • 使用当前环境求值e1到一个闭包
  • 使用当前环境求值e2到一个值
  • 在闭包的环境中求值闭包的函数体:需要添加
    • 映射函数参数名到参数值
    • 对于递归,映射函数名到整个闭包

作者: ntestoc

Created: 2018-12-30 Sun 12:37

转载于:https://www.cnblogs.com/ntestoc/p/10199061.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值