我正在努力通过编译器: Abdulaziz Ghuloum的后端到前端(并再次回到前面).它似乎缩写为完整课程/研讨会中的预期,所以我试图自己填写这些内容.
例如,我试图在DrScheme的R5RS风格中使用他的测试框架,但它似乎不喜欢宏的东西:
src/ghuloum/tests/tests-driver.scm:6:4: read: illegal use of open square bracket
Run Code Online (Sandbox Code Playgroud)
我已经阅读了他关于课程的介绍文章,编译器构建的增量方法,它对所使用的技术进行了很好的概述,并提到了一些可能需要为"额外信用"实现的功能的方案,但他没有没有提到他在课程中使用的计划.
更新
我还在深入研究原始问题(调查以下Eli建议的Petit Scheme等选项),但发现了一个与Gholoum工作有关的有趣链接,所以我将其包括在内.
[Ikarus Scheme](http://en.wikipedia.org/wiki/Ikarus_ (Scheme_implementation ))是Ghuloum的想法的实际实现,并且似乎是他的博士学位的一部分.工作.它应该是R6RS的首批实现之一.我现在正在尝试安装Ikarus,但是配置脚本不想识别我的系统安装的libgmp.so,所以我的问题仍未得到解决.
例
以下示例似乎适用于使用Pretty Big在DrEd中运行的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")
)
Run Code Online (Sandbox Code Playgroud)
尝试用#lang方案替换require指令会导致错误消息
foo.scm:7:3: expand: unbound identifier in module in: emit
Run Code Online (Sandbox Code Playgroud)
这似乎是由于未能加载tests-driver.scm.尝试使用#lang r6rs会禁用REPL,我真的很想使用它,所以我将尝试继续使用Pretty Big.
感谢Eli Barzilay的耐心帮助.
他使用的语言很可能是ChezScheme。无论如何,PLT 中的 R5RS 语言是 R5RS 的相当严格的版本,带有方括号之类的扩展会引发错误 - 并且使用默认语言可能会获得更多里程#lang scheme。(或者,如果失败,请尝试看看是否可以使用 Petit——Chez 的免费版本。)