削除された内容 追加された内容
106 行
 
==手続き==
Schemeには「手続き」(procedure)という概念があります。これは幾つかの処理を行いその結果を返すまとまりで、[[w:数学]]における[[w:関数|関数]]と非常に良く似ています。たとえば、[[w:数学|数学]]では「f(x,y) = x + y のとき、 f(1,2) = 3である」などといいますよね。Schemeでは「f(x,y) = x + y」の部分を「手続きの定義」、「f」を「手続き」、手続きの評価に必要な値を受け取るxとyを「仮引数」と呼びます。「f(1,2)」の部分を「手続きの呼び出し」、「1」と「2」のように手続きの評価に使われる値を「引数」、実行した結果である「3」を「返り値」といいます。
では、手続きの呼び出しを表現してみましょう(実は下記の手続きの解説には幾つか方便が含まれています。ですが、ここで詳細を解説すると難しくなりすぎるので、詳しくは後述します。手続きの定義は少し難しいので後回しにします)。
 
手続きはただ命令や数式の列をまとめる役目だけではありません。Schemeの豊富な機能は手続きを介して提供されているのです。また、あなたの書いたプログラムの機能を他のプログラムに公開するとき、それは手続きの定義をって行われます。Schemeの機能を呼び出すとは、用意された手続きを呼び出す構文を書くことと同義です。
 
Schemeの手続きの呼び出しは「(手続き名 引数1 引数2 ……)」という構文です。手続き名は変数です。手続きがどんな引数を取るのかは手続きによって異なります。手続き名やそれぞれの引数の間はひとつ以上の空白文字で区切らなければなりません。手続き名や引数の間に空白文字がないと、区切りが分からなくなってしまうからです。空白文字とは改行、タブ文字、半角スペースの3つのいずれかです。コンソールから改行を入力すると処理系は評価を開始してしますが、閉じていない括弧があるときなどはまだ入力が途中だと判断され評価は行われません。この構文はどんな手続きでも同じです。Schemeのほとんどの手続きは、その引数が評価されてから手続きに渡されます。
115 行
手続き呼び出しの丸括弧は数学の優先順位を示す括弧とは異なり、省略できません。このため、数学のような乗算が加算に優先する、といった優先順位はSchemeには存在しません。この仕様は記号の優先順位を覚える必要がない反面、数式を煩雑にしがちで、Schemeらしい点でもあります。手続きの呼び出しが何重にもなると括弧の数を間違いやすいです。括弧は「(」と「)」がきちんと対になっていなければなりませんから気をつけましょう。SchemeのようなLisp系の言語は括弧だらけになるから苦手、という人も少なくないです。
 
Schemeには加算をする手続き「+」が予め定義されています。さっきの構文にのっとると、数学での「1 + 2」はSchemeでは「(+ 1 2)」と表記されます。インタプリタ処理系実行して試してみましょう。できたら「1 + 2」以外にも試してみましょう。引数の和が返ってくるはずです。
 
>(+ 1 2)
130 行
なんだか変な構文だと思われるかもしれませんが、これらの構文は「S式」と呼ばれ、Schemeの構文のシンプルな言語仕様を支えています。「S式」は前置記法と呼ばれるもののひとつで、手続き名にあたるものが先頭に来ます。「前置記法」があるなら「中置記法」「後置記法」もあり、C言語など数学のような「1 + 2」という感じの中置記法を使えるものもあります。C言語には3種類全ての記法が入り混じっていますが、SchemeなどのLisp系の言語は、あえて前置記法のみに絞ることで、シンプルな言語仕様を保っています。
 
幾つか手続き呼び出しに関して気をつけておくことがあります。手続きには「手続き名」「引数の数」「引数の型」「返り値の型」などの要素を持っています。たとえば、幾つ引数をとるかは手続きごとに決められており、多すぎたり少なかったりすると実行したときに[[w:エラー]]になります。ただ、たまたま「+」は引数が幾つあってもよい手続きです。
また、手続きは引数の型が決まっています。たとえば、[[w:加算]]をする手続き「+」は文字列は引数に呼び出すとエラーです。
たまたま「+」は引数の順番を変えても同じ値が返ってきますが、ほとんどの手続きは引数はその順番に意味があります。たとえば、「-」は1つ目の引数の値から2つめ以降の引数の値を減算する手続きなので、「(- 10 5)」と「(- 5 10)」の値は違います。
Schemeには予め幾つかの手続きが定義されており、ユーザは新たに手続きを定義することもできます。そのSchemeインタプリタ処理系にどの手続きが用意されているか確かめるには、そのインタプリタ処理系[[w:ヘルプ]]と言語仕様を確認する必要があります。
 
==束縛==