Scheme 如何将此方案代码转换为Racket
我不熟悉这个计划。这是麻省理工学院SICP课程的代码示例Scheme 如何将此方案代码转换为Racket,scheme,racket,Scheme,Racket,我不熟悉这个计划。这是麻省理工学院SICP课程的代码示例 (define (+ x y) (if (= x 0) y (+ (-1+ x) (1+ y)))) 如何将其转换为球拍代码?我想转换成Racket,因为我使用DrRacket运行代码,我喜欢这样。它一直工作到现在,但抱怨该计划的增量操作员 我得到的错误是: 定义值:无法更改常量变量:+ 对未定义标识符的引用:-1+ 要修复第二个错误,请将(-1+x)更改为(-x1),将(1+y)更改为(+y1)。应该可以
(define (+ x y)
(if (= x 0)
y
(+ (-1+ x) (1+ y))))
如何将其转换为球拍代码?我想转换成Racket,因为我使用DrRacket运行代码,我喜欢这样。它一直工作到现在,但抱怨该计划的增量操作员
我得到的错误是:
定义值:无法更改常量变量:+
对未定义标识符的引用:-1+
要修复第二个错误,请将
(-1+x)
更改为(-x1)
,将(1+y)
更改为(+y1)
。应该可以帮助您解决第一个错误
如果要使用-1+
和1+
,您可以自己定义它们:
(define (1+ x) (+ x 1))
(define (-1+ x) (- x 1))
这将在球拍中很好地工作:
(define (add x y)
(if (= x 0)
y
(add (sub1 x) (add1 y))))
一些评论:
- 该过程的名称
将很麻烦,因为它将与方案中的原语添加操作冲突;如果使用不同的名称,例如+
(这将修复第一个错误),则会更简单add
不是Racket中的程序,请将其替换为-1+
(这将修复第二个错误)。或者,您可以为此过程定义别名,如下所示:sub1
(define-1+sub1)
不是Racket中的程序,请将其替换为1+
。或者,您可以为此过程定义别名,如下所示:add1
(define 1+add1)
- 可选:您可以编写
(零?x)
+
函数——这只意味着你在自己的模块中有自己的定义。@EliBarzilay同意了,我重新表述了我的答案。不是你不能,只是不方便。你在DrRacket里用的是什么语言?使用基于#lang
的语言(例如#lang racket
),可以重新定义来自该语言的原语,如+
。如果您使用的是学生语言,它会限制您以提供更好的错误报告。正如您所知,#lang scheme
是一种古老的向后兼容语言。您可能只想使用#lang racket
。我敢打赌,您之所以会出现此错误,是因为将内存限制设置得太低,或者您的程序存在错误(例如,无限循环)。我希望这个问题能够回答您如何在DrRacket IDE中运行上述代码,而无需手动翻译。