1
(define (subtract-1 n)
  (string-append "Number is: " (number->string n))
  (cond
    [(= n 0) "All done!"]
    [else (subtract-1(- n 1))]))

我不断收到错误:define: 只期望函数体有一个表达式,但发现了 1 个额外的部分。我不明白为什么我会得到这个。

注意事项:使用 DrRacket 时,将语言设置为 BSL 可能会使 Racket 命令在编译时出错。

4

2 回答 2

5

您使用的语言(BSL)仅允许在过程主体中使用单个表达式,如果有多个表达式,则需要将它们打包在begin.

另请注意,该string-append行什么也不做,您应该打印它或累积它。这是一个可能的解决方案,其中包含我的建议:

(define (subtract-1 n)
  (begin
    (display (string-append "Number is: " (number->string n) "\n"))
    (cond
      [(= n 0) "All done!"]
      [else (subtract-1 (- n 1))])))

更好的是,printf为了简单起见,使用该过程:

(define (subtract-1 n)
  (begin
    (printf "~a ~s~n" "Number is:" n)
    (cond
      [(= n 0) "All done!"]
      [else (subtract-1 (- n 1))])))

无论哪种方式,示例执行都如下所示:

(subtract-1 3)
=> Number is: 3
=> Number is: 2
=> Number is: 1
=> Number is: 0
=> "All done!"
于 2013-01-14T21:29:09.370 回答
1

球拍文档(Sequencing)似乎建议您可能需要使用 begin 表达式才能使其工作,或者它可能是(subtract-1(- n 1))函数名称和参数之间缺少空格。

此外,您可能想要输出结果, string-append因为它实际上并没有按原样做任何事情。涵盖所有这些要点的示例:

(define (subtract-1 n)
    (begin
        (write (string-append "Number is: " (number->string n)))
        (cond
            [(= n 0) "All done!"]
            [else (subtract-1 (- n 1))])))
于 2013-01-14T21:33:58.777 回答