10

私はSchemeを学んでいます。私は最近、cond句の「else」という単語が欠落していることに気付く前に、プログラムのバグを見つけるのに(あまりにも多くの!)時間を費やしました。しかし、そのような状況での動作は少し奇妙に見えます。単純なプログラム(以下)だけで条件を試してみると、「whatever」はelse句で期待どおりに表示されますが、「else」がない場合は、周囲の二重引用符と解釈されない改行とともに表示されます。文字通り印刷された行。誰かが私に何が起こっているのか説明できますか?TIA。

   (define (foo x)
    (cond ((eq? x 0) (display "zero\n"))
          (display "whatever\n")))

   (define (bar x)
    (cond ((eq? x 0 ) (display "zero\n"))
          (else (display "whatever\n"))))

In the repl window:
Welcome to DrScheme, version 4.1.5 [3m].
Language: Pretty Big; memory limit: 128 megabytes.
> (foo 0)
zero
> (bar 0)
zero
> (foo 2)
"whatever\n"
> (bar 2)
whatever
> 
4

2 に答える 2

19

「else」は「true」の同義語です。cond の読み方は一連のテストであり、最初のテストが真であるとそのフォームが評価されます。

(cond  ( (test) (do this) )
       ( (test) (do this) ) )

これがあなたの最初のものです

 (cond ((eq? x 0) (display "zero\n"))
        (display "whatever\n")))

cond はそれを見て(eq? x 0)、それが偽であると判断しました。次の節は(display "whatever\n"). を見てdisplay、でdisplayはないnilので真です。次に、 string"whatever\n"を評価します。これは、単にそれ自体に評価されます。したがって、cond の値は"whatever\n"です。

さて、これがあなたの2番目のものです:

(cond ((eq? x 0 ) (display "zero\n"))
       (else (display "whatever\n"))))

ここでは、最初のテストが false で、2 番目のテストがelsetrue に評価されます。(考えてみれば、それが通常の if-then-else での「else」の意味です。「以前のテストのいずれも true ではなかったすべてのケースに true です。」)

さて、それに続くフォームは(display "whatever\n")です。これは、文字列引数をコンソールに送信し、何も返さない関数です。別のスキームでは、文字列値を返すだけでなく、それを出力する場合があります。

whatever
"whatever\n"
于 2009-05-01T22:52:11.203 に答える
10

foo関数では、condステートメントはテストする条件として評価されdisplayます。というシンボルが実際にあるdisplayので、それは true と"whatever\n"評価され、 は の結果として評価され(foo 2)ます。

于 2009-05-01T22:43:02.893 に答える