Scheme 如何将此方案代码转换为Racket

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)。应该可以

我不熟悉这个计划。这是麻省理工学院SICP课程的代码示例

 (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
      (这将修复第一个错误),则会更简单
    • -1+
      不是Racket中的程序,请将其替换为
      sub1
      (这将修复第二个错误)。或者,您可以为此过程定义别名,如下所示:
      (define-1+sub1)
    • 1+
      不是Racket中的程序,请将其替换为
      add1
      。或者,您可以为此过程定义别名,如下所示:
      (define 1+add1)
    • 可选:您可以编写
      (零?x)

    我今天到家后看看能不能弄清楚。你可以定义一个
    +
    函数——这只意味着你在自己的模块中有自己的定义。@EliBarzilay同意了,我重新表述了我的答案。不是你不能,只是不方便。你在DrRacket里用的是什么语言?使用基于
    #lang
    的语言(例如
    #lang racket
    ),可以重新定义来自该语言的原语,如
    +
    。如果您使用的是学生语言,它会限制您以提供更好的错误报告。正如您所知,
    #lang scheme
    是一种古老的向后兼容语言。您可能只想使用
    #lang racket
    。我敢打赌,您之所以会出现此错误,是因为将内存限制设置得太低,或者您的程序存在错误(例如,无限循环)。我希望这个问题能够回答您如何在DrRacket IDE中运行上述代码,而无需手动翻译。