【问题标题】:how do I convert this Scheme code to Racket如何将此方案代码转换为 Racket
【发布时间】:2012-06-18 20:48:42
【问题描述】:

我是新来的计划。这是麻省理工学院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+

【问题讨论】:

  • 您在 DrRacket 中使用什么语言?使用基于#lang 的语言(例如#lang racket),您可以重新定义来自该语言的+ 等原语。如果您使用的是学生语言,它会限制您以提供更好的错误报告。
  • 您知道,#lang scheme 是一种旧的向后兼容语言。您可能只想使用#lang racket。我敢打赌,由于您的内存限制设置得太低或您的程序有错误(例如,无限循环),您会收到此错误。
  • 我希望这个问题能够回答如何在 DrRacket IDE 中运行上述代码而无需手动翻译。

标签: scheme racket


【解决方案1】:

这在 Racket 中可以正常工作:

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

一些cmets:

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

【讨论】:

  • 可以定义一个+函数——这只是意味着你可以在你自己的模块中得到你自己的定义。
  • @EliBarzilay 同意,我改写了我的答案。不是你不能,只是不方便。
【解决方案2】:

要修复第二个错误,请将(-1+ x) 更改为(- x 1) 并将(1+ y) 更改为(+ y 1)This answer 应该可以帮助您解决第一个错误。

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

(define (1+ x) (+ x 1))
(define (-1+ x) (- x 1))

【讨论】:

  • 我今天回家看看能不能弄明白。
猜你喜欢
  • 2021-03-07
  • 1970-01-01
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-19
  • 2019-05-26
相关资源
最近更新 更多