{# —— Umami 统计(Cloud 版)—— #}

9.19

周五

Scheme Interpreter

这学期程设课有四次大作业,Scheme Interpreter 是第三个,花了两天时间写完,一天时间 Debug,加起来共 30 小时左右,今早终于 AC 了所有测试点。代码仓库是 https://github.com/Galuisss/SchemeInterpreter

中间重构了两次代码,第一次是把 Value 类型删掉,统一到 Expr 类型里,就是把值也看成表达式——这种表达式的行为是返回自身。原框架下,lexer, parser, evaluator 三个层次的关系比较混乱,其对应的 Syntax, ExprValue 三个类型不能很好地隔离。按照那个框架的逻辑,Expr::eval 函数返回 Value 对象,但例如 lambda 求值返回的闭包,就包含了 Expr 对象作为函数体。所以 ExprValue 在这里是相互定义的关系,那么不妨直接变成同一个东西了。

第二次是修改了环境模型的底层实现,改用 unordered_map,也就是哈希表,而不是链表模型。这样修改之后,环境操作变得更清晰简单,也效率更高。

更换文档阅读器

本来用的是 SumatraPDF,属于轻量级的阅读器,意思大概就是:启动很快。然而,它既不支持为一个文件打开多个视图,也不支持在多个窗口打开同一个文件,所以不能对照阅读一个文件的两个地方。所以换成了 Adobe Acrobat,它支持在多个窗口打开同一个文件。

测试了一下从点击图标到自动加载完成上次阅读文件的时间,SumatraPDF 是 0.75s,Adobe Acrobat 是 4.6s,后者会在主页面停顿很久再开始加载上次阅读的文件,如果在这几秒内打开任何文件,会产生一个报错。

现在可以边看题目边看答案了,很好!