我的Scheme编译器出了什么问题?

发布于 2024-08-22 21:05:58 字数 982 浏览 1 评论 0原文

我想知道为什么嵌套函数调用不起作用。

我正在从 Dybvig 的论文 http://www 中实现 Dybvig 的基于堆的模型.cs.indiana.edu/~dyb/pubs/3imp.pdf 第 3 章。
我是用 JavaScript 做的。来源在这里:http://github.com/z5h/zb-lisp
现在几乎所有内容都在 parser.js 中。

要运行,

  1. 请使用 Firebug 在 Firefox 中加载 test.html。
  2. Evaluator.newEvaluator().eval("方案代码放在这里");
  3. 在代码末尾留下一些空格,因为解析器现在有点损坏并且依赖于末尾的空格。 (待修复)。例如 .eval("12 ") 而不是 .eval("12")

很多东西都有效。但我在嵌套函数调用时遇到问题: 这有效并返回 5
(设置!i (lambda (x) x)) (设置!ii (ii)) (ii 5)
这不起作用:
(设置!i (lambda (x) x)) (i (i 5))
这也不是:
(set! i (lambda (x) x)) ((ii) 5)

问题可能出现在编译嵌套调用的第 577 行附近,或者可能出现在frame 或 apply 的代码中。 PDF 的 3.4.2 节描述了示例实现。

这是一个相当复杂的问题。代码有很多粗糙的地方。
任何意见都会受到赞赏。

我很乐意回答我的实施中的任何问题。

I'm wondering why nested function calls don't work.

I'm implementing Dybvig's Heap-based model from his paper http://www.cs.indiana.edu/~dyb/pubs/3imp.pdf Chapter 3.
I'm doing it in JavaScript. Source is here: http://github.com/z5h/zb-lisp
Pretty much everything is in parser.js right now.

To run,

  1. load test.html in Firefox with Firebug.
  2. Evaluator.newEvaluator().eval("scheme code goes here");
  3. Leave some whitespace at the end of the code as the parser is a little broken right now and relies on whitespace at the end. (to be fixed). e.g. .eval("12 ") not .eval("12")

Lots of stuff works. But I'm having problems with nested function calls:
This works and returns 5:
(set! i (lambda (x) x)) (set! ii (i i)) (ii 5)
This does not work:
(set! i (lambda (x) x)) (i (i 5))
Nor does this:
(set! i (lambda (x) x)) ((i i) 5)

The problem might be around line 577 where a nested call is compiled, or perhaps in the code for frame or apply. Section 3.4.2 of the PDF is where sample implementation is described.

This is a pretty complex question. The code has many rough edges.
Any input is appreciated.

I'm happy to answer any questions my implementation.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

心舞飞扬 2024-08-29 21:05:58

原来我早早就清理了价值肋骨。

改进后的代码可以在我的 github 上找到。

It turns out I was clearing the value rib early.

The improved code is available at my github.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文