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

エラーが発生し続けます: define: 関数本体の式は 1 つだけが必要ですが、余分な部分が 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

Racket のドキュメント ( Sequencing(subtract-1(- n 1)) ) は、これを機能させるには begin 式を使用する必要があるか、関数名とパラメーターの間にスペースがない可能性があることを示唆しているようです。

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 に答える