使用define in define不断给我一个错误。为什么?

时间:2016-08-10 09:24:07

标签: functional-programming scheme

据我所知,在某些编码中允许使用define,但每次都会给我一个错误。 例如:

(define (last-digit n) (remainder n 10))

(define (reverse-int n)
  (define (rev-iter n result)
    (if (= n 0)
        result
       (rev-iter (quotient n 10) (+ (* result 10) (last-digit n)))))
  (rev-iter n 0))

错误是:

*define: expected only one expression for the function body, but found 1 extra part*  

和Dr.Racket标志着最后一排。

我从书中复制这样的小程序,我仍然会收到错误。问题出在哪里?

1 个答案:

答案 0 :(得分:2)

DrRacket支持许多表面语言。您使用的是与Scheme相关的教学语言之一,但不包含整个语言。

在左下角的下拉列表中。选择"从源"确定语言,然后添加为第一行:

#!racket
#!r5rs
#!r6rs

第一行告诉DrRacket如何阅读程序以及开头应该可用的内容。在下拉列表中使用Scheme或Pretty Big选择遗留语言及其标准Scheme。使用"从源中确定语言"是最好的方式。选择哪个取决于您所关注的教程以及您可以使用的(非标准)功能。找出你应该使用的标准,并相应地设置第一行。

#!racket是DrRacket自己的Scheme语言方言版本以及DrRacket编写的内容。它主要与R5RS兼容,但有一些与所有Scheme标准不兼容的差异。

#!r5rs#!r6rs对应于R5RS和R6RS标准报告。 DrRacket对于报告在最严格意义上实施的两者都没有惊险的实施。例如。在

下工作的R5RS计划 DrRacket中的

#!r5rs很可能适用于所有其他符合R5RS的实现,只要您只使用有效的标识符(例如,程序中没有以#%开头的符号)

对于#!r6rs,您至少需要一次导入,因此您只需添加(import (rnrs))作为第二行,并且您可以使用大部分R6RS语言。

#!r6rs与R5RS的工作方式相同,只是DrRacket公开了它的模块系统。只要您保留自己的库和标准库,它就是可移植的,但如果您导入的库设计为#!racket,您可能会面临必须转换数据结构以使其工作而您不能指望它可以用于R6RS的任何其他实现。

最新版本的Scheme,R7RS,尚未在DrRacket中提供。