9.19
周五
Scheme Interpreter
这学期程设课有四次大作业,Scheme Interpreter 是第三个,花了两天时间写完,一天时间 Debug,加起来共 30 小时左右,今早终于 AC 了所有测试点。代码仓库是 https://github.com/Galuisss/SchemeInterpreter
中间重构了两次代码,第一次是把 Value
类型删掉,统一到 Expr
类型里,就是把值也看成表达式——这种表达式的行为是返回自身。原框架下,lexer, parser, evaluator 三个层次的关系比较混乱,其对应的 Syntax
, Expr
和 Value
三个类型不能很好地隔离。按照那个框架的逻辑,Expr::eval
函数返回 Value
对象,但例如 lambda
求值返回的闭包,就包含了 Expr
对象作为函数体。所以 Expr
和 Value
在这里是相互定义的关系,那么不妨直接变成同一个东西了。
第二次是修改了环境模型的底层实现,改用 unordered_map
,也就是哈希表,而不是链表模型。这样修改之后,环境操作变得更清晰简单,也效率更高。
更换文档阅读器
本来用的是 SumatraPDF,属于轻量级的阅读器,意思大概就是:启动很快。然而,它既不支持为一个文件打开多个视图,也不支持在多个窗口打开同一个文件,所以不能对照阅读一个文件的两个地方。所以换成了 Adobe Acrobat,它支持在多个窗口打开同一个文件。
测试了一下从点击图标到自动加载完成上次阅读文件的时间,SumatraPDF 是 0.75s,Adobe Acrobat 是 4.6s,后者会在主页面停顿很久再开始加载上次阅读的文件,如果在这几秒内打开任何文件,会产生一个报错。
现在可以边看题目边看答案了,很好!