3

我是新来的计划。这是麻省理工学院 SICP 课程的代码示例。

 (define (+ x y)
  (if (= x 0)
      y
      (+ (-1+ x) (1+ y))))

如何将其转换为球拍代码?我想转换为 Racket,因为我使用 DrRacket 来运行代码,我喜欢这样。它一直工作到现在,但抱怨方案的增量运算符。

我得到的错误是:

  1. define-values: cannot change constant variable: +
  2. reference to undefined identifier: -1+
4

2 回答 2

12

这将在球拍中正常工作:

(define (add x y)
  (if (= x 0)
      y
      (add (sub1 x) (add1 y))))

一些评论:

  • 该过程的名称+会很麻烦,因为它会与Scheme中的原始添加操作发生冲突;如果您使用不同的名称会更简单,例如add(这将修复第一个错误)
  • -1+不是 Racket 中的程序,将其替换为sub1(这将修复第二个错误)。或者,您可以为此过程定义一个别名,如下所示:(define -1+ sub1)
  • 1+不是 Racket 中的程序,请将其替换为add1. 或者,您可以为此过程定义一个别名,如下所示:(define 1+ add1)
  • 可选:而不是(= x 0)你可以写(zero? x)
于 2012-06-15T18:58:29.993 回答
2

要修复第二个错误,请更改(-1+ x)(- x 1)和。这个答案应该可以帮助您解决第一个错误。(1+ y)(+ y 1)

如果你想使用-1+and 1+,你可以自己定义它们:

(define (1+ x) (+ x 1))
(define (-1+ x) (- x 1))
于 2012-06-15T18:55:44.973 回答