偽、それ以外の全ては真ですが、いずれにしても真と偽の値を持つ点では変わりがありません。それが「普通」というものです。すべての手続きは成功か失敗かのいずれかの状態を取ります。成功したときには手続きは値を返し、失敗したときには失敗したという情報を返します。(エラー)チェックした内容が偽だったとき引数の評価が「失敗」したとき失敗します。失敗は例外のようなものと考えてもらえれば良いかもしれません。失敗には他の言語の例外のような種類はなく、ただ失敗ということだけが伝わります。一つの例として、大小比較を考えてみましょう。左辺が右辺よりも小さいとき成功して、全体の値として右辺の値を返します。左辺が右辺よりも小さいときには失敗します。以下の式はどうなるでしょう。c」全体が失敗します。式が成功するかどうか判定するという動作をします。write(a)は「一行読み込んできて、それが成功すればそのまま印字する」という動作をします。値について考えなくてよいということは、元々真偽値を返すようにできていない手続きでも、失敗しないかどうかという判定に使えるということです。以下のプログラムは入力から出力へのコピーです。ループ本体にあたる部分が何もなくてもちゃんとコピーが行われる点が注目に値します。ひとつの特長がこのジェネレータです。失敗ベースの判定との組み合わせにより強力で興味深い機構を実現しています。演算子「|」はジェネレータを返します。これは「失敗するまで両辺の値を生成する」というジェネレータです。これを使うと「暗黙の繰り返し」が実現できるのです。例を使って見てみましょう。値を印字する」という動作をします。endという動作です。いう名前で提供されるそうです。ジェネレータは「次々と値を返す」ので、その個別の値ごとに処理することができます。write(k)という感じですね。返すジェネレータを与える式です。「恐ろしさ」はこの先にあります。j」の部分は文法に組み込まれているわけではなく、ただの代入文だということです。呼び出すジェネレータは別にトップレベルに存在する必要はありません。与える式はジェネレータを含む式であれば、なんでも構わないのです。5)のようなことも書けます。複数のジェネレータを組み合わせることさえできます。すべての組み合わせを自動的に実行してくれます。プログラミングの醍醐味です。ジェネレータは自分で定義することもできます。