関数の出力を特定の入力で解釈するように求められましたが、関数がどのように機能するのかわかりません。ifの新しいバージョンであると思われますが、私にはまったく何もしないように見えます。
(define (if-2 a b c)
(cond (a b)
(else c)))
私には、これは常にbを出力するように見えますが、よくわかりません。
関数の出力を特定の入力で解釈するように求められましたが、関数がどのように機能するのかわかりません。ifの新しいバージョンであると思われますが、私にはまったく何もしないように見えます。
(define (if-2 a b c)
(cond (a b)
(else c)))
私には、これは常にbを出力するように見えますが、よくわかりません。
cond
フォームに慣れていないようです。それはこのように動作します:
(cond
((<predicate1> <args>) <actions>)
;^^-- this form evaluates to true or false.
; If true, we do <actions>, if not we move on to the next predicate.
((<predicate2> <args>) <actions>) ; We can have however many predicates we wish
(else ;<-- else is always true. This is our catch-all.
<actions>))
以下は、いくつかの変数の名前が変更されたコードです。
(define (if-2 predicate arg1 arg2)
(cond
(predicate arg1)
(else arg2)))
テストで常に返される理由を理解するために、Schemeは、明示的なfalseシンボル(通常)と空のリストarg1
を除いて、すべてをtrueと見なしていることを思い出してください。#f
'()
したがって(if-2 > 2 3)
、condフォームを呼び出すと、次のように評価されます。
(cond
(> 2)
;^---- `>` is not the empty list, so it evals to #t
(else 3))
次にcond
、真の値に関連付けられていることが最初に見つかったものを返すので、2が返されます。
期待どおりに動作させるif-2
には、別の方法で呼び出す必要があります。たとえば、3は2より大きいため、 (if-2 (> 3 2) 'yep! 'nope!)
戻ります。'yep!