9.19
2025-09-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,后者会在主页面停顿很久再开始加载上次阅读的文件,如果在这几秒内打开任何文件,会产生一个报错。
现在可以边看题目边看答案了,很好!
评论区
最新评论
--