動的な型づけ


いままでふれてきませんでしたが、 Scheme は静的な型システムを持たない、 動的に型付けされた言語 (dynamically typed language)です。

さきほどまでみてきたプログラムにも 変数の型宣言はなかったとおもいます。 また、 C 言語などのようにコンパイル時に型情報をしらべ、 合致しなかったら error を出すと言うこともありません。

このため、引数の数がおかしいのは 関数を実行しようとした段階で判定されます。 また、boolean の足し算などをしようとした段階ではじめて、 値についている型情報と関数が要求する型が合致しないといって、 error を出します。 とはいえ、実行時に 値の型を調べるための手続きは各種準備されているので、正しいプログラミングは出来ます。

> (define (bar x)
    (if (= x 0)
        #t
        (+ #t #f)))  ; + は、 本来 #t,#f を受け付けない
> (bar 0)
#t                   ; (bar 0) は問題無く動く
> (bar 1)            ; (bar 1) を実行すると、 + の引数が違うと error を出す
+: expects type <number> as 1st argument, given: #t; other arguments were: #f

99.9.29/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp