'else'が省略された場合、Schemeの 'cond'句で何が起こりますか?
質問
Schemeを学習中です。私は最近、プログラムのバグを見つけるのに時間を費やしていましたが、cond句に「else」という単語がないことに気付きました。しかし、そのような状況での動作は少し奇妙に見えます。単純なプログラム(下)で条件を実験すると、else句で期待どおりに「何でも」が表示されますが、「else」なしでは表示されますが、周囲の二重引用符と未解釈のnew文字通り印刷された行。誰が私に何が起こっているのか説明できますか? 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
>
解決
" 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
ではないので、本当です。次に、文字列" whatever \ n"
を評価します。これは単純に評価されます。したがって、condの値は" whatever \ n"
です。
さて、次は2番目です:
(cond ((eq? x 0 ) (display "zero\n"))
(else (display "whatever\n"))))
ここで、最初のテストはfalseで、2番目のテストに進みます。これは else
で、trueと評価されます。 (考えてみれば、それは通常のif-then-elseで" else"が意味することです:"前のテストがいずれも真ではなかったすべての場合にtrue")
今、その後のフォームは(display" whatever \ n")
です。これは、文字列引数をコンソールに送信し、何も返さない関数です。これは、表示が行われるためです。別のスキームでは、文字列値を返すだけでなく、印刷することもあります。その場合、次のように表示されます
whatever
"whatever\n"
他のヒント
foo
関数では、 cond
ステートメントはテストする条件として display
を評価します。実際に display
というシンボルがあるため、trueと評価されるため、" whatever \ n"
は(foo 2)の結果として評価されます
。