本文使用哪种方案?

时间:2014-08-22 21:55:56

标签: scheme racket

我正在阅读“计划的三种实施模式”。我想继续工作并实现解释器,但我收到错误消息。我认为作者是chez方案背后的人,所以除了DrRacket(R5RS模式)之外我还尝试过。有谁知道将运行此示例代码的方案设置?似乎这是计划的常见问题。我尝试的每个示例代码都有一些问题,或者是在不同版本中创建的。这是该论文的链接。感谢。

https://www.cs.unm.edu/~williams/cs491/three-imp.pdf

3 个答案:

答案 0 :(得分:5)

你得到错误并不奇怪。该论文写于1987年,当时标准是R2RS(1985),直到R3RS于11月发布。这与R5RS有很大的不同,R5RS是目前实际使用的最早的版本,所以你不会找到任何现代的方案来运行这些例子,除非它只是经过4次修订的基本部分

EG。我看到使用了rec,并在R2RS to R3RS changelog中删除了它。

其他更改日志是:

由于很多人都关注SICP而且它也来自R3RS时代,您可能想尝试DrRacket中的SICP compability package。将左下角的选择作为"从源中确定语言"您将#lang racket替换为#lang planet neil/sicp,然后按 RUN

它会显示一些错误但只是忽略它,直到它完成并再次按 RUN 。你现在有一种语言,SICP的例子比现代的R5RS更接近Kent Dybvigs语言。

现在SICP我猜测是R3RS,但reading this thread我实际上不确定。可能会出现兼容性包仅适用于SICP示例,因此它可能仍然是颠簸的。

我想我读过有关LISP方言的每篇旧论文的一半,要了解语言的演变以及思想是如何形成的。我首先学习了CL,在阅读Paul Grahams essay about McCharty后制作了自己的LISP1。我阅读了lambda论文(最初的Scheme标准论文)并最终看了all SICP videoes。从R5RS开始,我一直保持在线报告关闭,因为我确实收到了错误,但是知道历史也很好。

随时随地添加问题,但添加一些关于它的信息是一个古老的方案以及您希望它在哪些方面工作。

祝你好运:)

答案 1 :(得分:2)

Kent Dybvig在他的书 The Scheme Programming Language 第3版第8.4节中定义了rec,使用了来自R5RS的syntax-rules宏:

  

rec是一个允许内部递归的语法扩展   使用minimal创建的匿名(非外部命名)过程   努力。

(define-syntax rec
  (syntax-rules ()
    ((_ x e) (letrec ((x e)) x))))

> (map (rec sum
    (lambda (x)
      (if (= x 0)
          0
          (+ x (sum (- x 1))))))
  '(0 1 2 3 4 5))
(0 1 3 6 10 15)

答案 2 :(得分:1)

除非我的记忆失败,否则Dybvig只使用标准结构 - 记录和记录案例除外。您可以在此处找到Racket的记录和记录案例的实现:

http://lists.racket-lang.org/users/archive/2002-August/000290.html http://lists.racket-lang.org/users/archive/2002-August/000292.html