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