我是计划的新手。这是麻省理工学院SICP课程的代码示例。
(define (+ x y)
(if (= x 0)
y
(+ (-1+ x) (1+ y))))
如何将其转换为球拍代码?我想转换为Racket,因为我使用DrRacket来运行代码,我喜欢它。它一直工作到现在,但抱怨计划的增量运算符。
我得到的错误是:
define-values: cannot change constant variable: +
reference to undefined identifier: -1+
以下是我正在学习的视频的链接:
答案 0 :(得分:12)
这在Racket中可以正常使用:
(define (add x y)
(if (= x 0)
y
(add (sub1 x) (add1 y))))
一些意见:
+
会很麻烦,因为它会与Scheme中的原始add操作发生冲突;如果你使用其他名称,例如add
(这将解决第一个错误),这会更简单。-1+
不是Racket中的过程,请将其替换为sub1
(这将修复第二个错误)。 (可选)您可以为此过程定义别名,如下所示:(define -1+ sub1)
1+
不是Racket中的过程,请将其替换为add1
。 (可选)您可以为此过程定义别名,如下所示:(define 1+ add1)
(= x 0)
,您可以撰写(zero? x)
答案 1 :(得分:2)
要解决第二个错误,请将(-1+ x)
更改为(- x 1)
,将(1+ y)
更改为(+ y 1)
。 This answer可以帮助您解决第一个错误。
如果您想使用-1+
和1+
,可以自行定义:
(define (1+ x) (+ x 1))
(define (-1+ x) (- x 1))