如何将此Scheme代码转换为Racket

时间:2012-06-15 18:44:46

标签: lisp scheme racket sicp

我是计划的新手。这是麻省理工学院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+
  3. 以下是我正在学习的视频的链接:

    http://www.youtube.com/watch?v=dlbMuv-jix8&t=1325

2 个答案:

答案 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))