'else'が省略された場合、Schemeの 'cond'句で何が起こりますか?

StackOverflow https://stackoverflow.com/questions/813587

  •  03-07-2019
  •  | 
  •  

質問

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)の結果として評価されます

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top