2018011289 包涵
- 扩展call
- 首先修改LocalVarDef,让函数对象初始化为指向大小为8的内存区域的指针
- 修改varsel,让varsel在select到函数时,返回函数对象的指针,包括函数指针和可选的this
- 修改call,直接利用函数对象进行函数调用
- 方法名当作函数使用
- 修改varsel,让varsel对于各种情况都可以正确返回一个函数对象
- lambda表达式
- 首先生成lambda表达式对应的函数,利用lambda表达式栈和参数栈,中断当前函数的parsing,生成lambda表达式之后,再恢复对当前函数的parsing
- 然后生成lambda函数的对象,包括函数指针、可选的this和捕获变量,将生成的函数对象返回
- 根据Call的种类和传递的类型信息,决定调用的方式,相应修改传递参数的方式和数量
- 相应修改this和varsel在lambda表达式中的行为
- pa2的实现细节已经忘了,这次又要对pa2的代码做很多的修改,包括确定捕获变量、传递更丰富的类型信息等,非常痛苦,又复习了一边pa2的代码
- 对rust语言的特性不熟悉,导致很久都没有找到在ast中记录捕获变量的合适的数据结构,最终用了refcell才得以实现
- 没有完全看懂文档,只好部分按照自己的思路来实现,可能是出现bug的原因。