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

*/-->

pre.src {background-color: #292b2e; color: #b2b2b2;}

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

最新文章

  1. simpson
  2. Unity小游戏制作 - 暗影随行
  3. Beta版
  4. 【代码笔记】iOS-抽屉效果的实现
  5. POj3104 Drying(二分)
  6. CentOS 6.5下源码安装MySQL 5.6
  7. POSTGRESQL9.5之pg_rman工具
  8. [流媒体]VLC主要模块
  9. 解决Unable to resolve superclass的问题
  10. MySQL优化器cost计算
  11. listview——显示窗体
  12. python操作---RabbitMQ
  13. spring整合mybatis(hibernate)配置
  14. 了解计算机与操作系统发展阶段以及android操作系统的发展史
  15. windows7 ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 的解决方法
  16. Spring Boot入门(13)自制音乐平台
  17. March 11th, 2018 Week 11th Sunday
  18. SQL Server-索引故事的遥远由来,原来是这样的?(二十八)
  19. 我们在学习JDBC的时候会过度到J2EE。
  20. 滚动歌词制作 之 ncm格式转mp3

热门文章

  1. 配置内核源码make menuconfig时出现 #include CURSES_LOC错误
  2. 九、双端队列LinkedBlockDeque
  3. 5、static、final、匿名对象、内部类、包、修饰符、代码块
  4. MySQL数据源驱动报错
  5. InfluxDB 的卸载与重装
  6. HDU 3306 Another kind of Fibonacci ---构造矩阵***
  7. C#3.0匿名类和Lanmda表达式
  8. Algorithm——整数反转
  9. WinForm实现Rabbitmq官网6个案例-Routing
  10. MathQuill.js