かっこ内のすべての Scheme 形式は、またはのようなアプリケーションです。最初は引数付きの関数として呼び出し、値を生成します。2 番目は引数を指定して呼び出そうとしますが、プロシージャではないため、エラーが発生します。引数のないアプリケーションも同様です。それでも、引数なしで呼び出されるように、最初の部分として適用されるプロシージャが必要ですよね? スキームでは、括弧は重要です。それらは単にグループ化するためのものではありません (他の言語のように)。したがって、余分な括弧があると、ブール値である結果を評価する余分な試行が発生します。つまり、プロシージャではないため、これはエラーです。(sin 42)
(42 sin)
sin
42
42
sin
42
(42)
それでは、'#f
ただ#f
です。同様に for #t
(両方とも自分自身に評価されます); 条件1は just (boolean の結果の同じセットを生成します) (( 1はブール値の比較には使用できません。数値のみで使用することになっています)) と同じです:(= test #t)
(equal? test #t)
test
=
(define (odd? x)
(cond
((= x 0) #f)
((= x 1) #t)
((even? (- x 1)) #f)
(else #t)))
また、次(if test #f else...)
と同じ(if (not test) else... #f)
です。
(define (odd? x)
(cond
((= x 0) #f)
((= x 1) #t)
((not (even? (- x 1))) #t)
(else #f))) ; (else ...) is like (#t ...)
論理接続詞を使用すると、同じ結果の句をマージでき、相互に排他的な句を再配置できます (相互排他性は明示的なガードで実現できます)。
(define (odd? x)
(cond
((and (/= x 0) ; a guard
(or (= x 1)
(not (even? (- x 1))))) #t)
((or (= x 0) #t) #f)))
しかし、どちらが正しい(cond (test #t) (else #f)
か:(if test #t #f)
test
(define (odd? x) (and (> x 0) ; `>` is better
(or (= x 1)
(not (even? (- x 1))))))
ガードは、負のes(> x 0)
のフォールスルーを防ぎます。x
しかし、これは完全に間違っています。n
奇数であるためには偶数でn-1
なければならず、その逆ではありません!
(define (odd? x) (and (> x 0) ; work only for positive integers
(or (= x 1)
(even? (- x 1)))))
と書くことはできます(not (odd? (- x 1)))
が、末尾再帰にはなりません。これは末尾再帰モジュロ コンス( 「コンストラクタ」として機能) になりますnot
が、理由2の歴史的なまぐれにより、Scheme 実装には TRMC 最適化は必要ありません。and
andor
フォームの最後の式は、実際には末尾の位置にあります。しかし、そうではありませんnot
。(( 2は 1974 年に記述されているにもかかわらず. ))
の定義についても同じことを繰り返しますeven?
。