【发布时间】:2011-01-11 00:47:26
【问题描述】:
我正在努力通过 Abdulaziz Ghuloum 的Compilers: Backend to Frontend (and Back to Front Again) 工作。它似乎是人们对完整课程/研讨会的期望的缩写,所以我正在尝试自己填写。
例如,我曾尝试在 DrScheme 的 R5RS 风格中使用他的测试框架,但它似乎不喜欢宏的东西:
src/ghuloum/tests/tests-driver.scm:6:4: read: illegal use of open square bracket
我已经阅读了他关于课程的介绍性论文An Incremental Approach to Compiler Construction,它对所使用的技术进行了很好的概述,并提到了一些可能想要实现“额外学分”的方案,但他没有'不要提及他在课程中使用的方案。
更新
我仍在深入研究最初的问题(调查以下 Eli 建议的 Petit Scheme 等选项),但发现了一个与 Gholoum 的工作相关的有趣链接,因此我将其包含在此处。
[Ikarus Scheme](http://en.wikipedia.org/wiki/Ikarus_(Scheme_implementation)) 是 Ghuloum 想法的实际实现,并且似乎是他博士工作的一部分。它应该是 R6RS 的首批实现之一。我正在尝试现在安装Ikarus,但是配置脚本不想识别我系统安装的libgmp.so,所以我的问题仍然没有解决。
示例
以下示例似乎适用于在 DrEd 中使用 Pretty Big 运行的 PLT 2.4.2
(require lang/plt-pretty-big)
(load "/Users/donaldwakefield/ghuloum/tests/tests-driver.scm")
(load "/Users/donaldwakefield/ghuloum/tests/tests-1.1-req.scm")
(define (emit-program x)
(unless (integer? x) (error "---"))
(emit " .text")
(emit " .globl scheme_entry")
(emit " .type scheme_entry, @function")
(emit "scheme_entry:")
(emit " movl $~s, %eax" x)
(emit " ret")
)
尝试将 require 指令替换为 #lang scheme 会导致错误消息
foo.scm:7:3: expand: unbound identifier in module in: emit
这似乎是由于未能加载 tests-driver.scm。尝试使用 #lang r6rs 会禁用我非常想使用的 REPL,因此我将尝试继续使用 Pretty Big。
感谢 Eli Barzilay 的耐心帮助。
【问题讨论】:
-
另外,新版本的 Chez Scheme 可能会破坏一些东西,所以即使你使用 Chez Scheme,涉及宏和模块的旧东西也可能无法正常工作。