为什么此表达式给我一个函数体错误?

dot*_*00b 1 scheme racket racket-student-languages

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

我不断收到错误消息:define:对于函数体,只期望一个表达式,但是发现了1个多余的部分。我不明白为什么要得到这个。

对自己的提示:使用DrRacket时,将语言设置为BSL可能会使Racket命令在编译时出错。

Ósc*_*pez 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))])))
Run Code Online (Sandbox Code Playgroud)

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

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

两种方式的示例执行都如下所示:

(subtract-1 3)
=> Number is: 3
=> Number is: 2
=> Number is: 1
=> Number is: 0
=> "All done!"
Run Code Online (Sandbox Code Playgroud)