3.2. 変数と関数

さて今、 どんな Scheme 構文も丸括弧でくくられること、 関数名や演算子はその先頭に置かれることが分かりましたが、 つぎは変数の作り方と使い方や、 関数の作り方と使い方を知っておかなければなりません。 まずは変数から始めましょうか。

3.2.1. 変数の定義

変数の定義のしかたには2通りの方法があるのですが、 let* を使う方が好まれています。 他のプログラミング言語に馴染まれた方には、 この定義文が局所 (ローカル) 変数の定義と有効なスコープを定めるコードと同じだと申しあげておきます。 具体的には例えば a と b の 2 変数を定義してそれぞれ 1 と 2 で初期化[し、 合算]するのなら、

        (let*
           (
              (a 1)
              (b 2)
           )
           (+ a b)
        )
      

のように書きます。 これはつぎのように1行でも書けます。

(let* ( (a 1) (b 2) ) (+ a b) )
[注記] 注記

コンソールウィンドウでは1行にまとめて記入しなければなりません。 でも普通はスクリプトが見易くなるように字下げを適宜行ないたいですよね。 この節で空白文字についてもう少し掘り下げて説明します。

このコードは a と b の2つの変数を定義して初期化し、 両局所変数の合算を表示して終わります。

3.2.2. 局所変数とは何でしょう

計算式 (+ a b)let* 式のあとではなくその内部に置いたことに注目してください。

その理由はスクリプト内に書かれた let* 式がそこで定義した変数の利用可能な範囲を決めているためです。 もし (+ a b) 式を (let* …) のあとに置いたのなら、 let* 式内で定義しておいた変数はこの式内でしか使えないのでエラーとなります。 このような変数のことをプログラマはローカル (局所) 変数と呼んでいるのです。

3.2.3. let*構文の一般規則

let* 構文の一般的な形式は、

        (let* (変数名 )
           )
      

となります。 (a 2) のようにして変数を括弧内で定義します。 はSchemeで通用する表現を与えます。 繰り返しますが使ってよい変数は let* 構文内で定義した変数だけです。 これらを局所変数というのでした。

3.2.4. 空白文字

先程、 スクリプトは字下げをして明確でまとまりのある書き方ができると申し上げました。 やってみたいと思われたことでしょう。 身に付けると良い習慣ですし、 Scheme 言語に問題を起こすことはありません。 空白文字はいくら増やしても Scheme インタープリタが無視しますので、 自由に使ってスクリプトを分かり易くまとめるのに役立てられます。 ただし Script-Fu コンソール上でだけは式全体を1行に書く必要があります。 つまり式の最初の括弧 ( から最後の括弧 ) までが Script-Fu コンソールの1行記入欄の中に全部入らなくてはなりません。

3.2.5. 新しい値を変数に代入

一度変数を初期化して使用したあとで、 スクリプト内で別の値を入れて使う必要が生じるかもしれません。 そんなときは set! の出番です。 変数の値を変更する構文はつぎのとおりです。

        (let* ( (いろは 10) ) (set! いろは (+ いろは いろは)) )
      

この構文がどんなことをしているかあててみてください。 そうしたら Script-Fu コンソールに実際に書き込んで試してみましょう。

[注記] 注記

例題に\記号が書かれていることがありますが、 これは実際は改行していないことを示しています。 この文字は無視し、 そのまま次の行の内容を続けてください。 つまり Script-Fu コンソールではこの文字は記入せず、 また Enter も途中で押してはいけません。

3.2.6. 関数

さて変数のコツを掴んだところでこんどは関数の扱い方に取り組みましょう。 関数はつぎの構文規則で定義します。

        (define
           (
              関数名
              パラメータの一群
           )
           
        )
      

ここで 関数名 は関数につけられた名前を、 パラメータの一群 にはひとつもしくは複数のパラメータの名前もしくは値を空白で区切って並べます。 には関数が呼ばれたときに実行する一連の式を書きます。 例えば、

(define (AddXY inX inY) (+ inX inY) )

の関数定義では AddXY が関数名であり、 inXinY が変数名です。 この関数は2つのパラメータを受けとり両者の和を返します。

C/C++ や Java や Pascal のような他の命令型言語のプログラミングを経験された方はそういった言語と比べて見るとこの関数定義に2つのことがらが抜け落ちていることに気付かれたことでしょう。

  • ひとつめはどのパラメータにもがありません。 つまり文字列型とか整数型といった宣言が見あたりません。 Scheme 言語は型なし言語なのです。 この特徴があるので手軽に素早くスクリプトが書けます。

  • ふたつめは関数が得た結果の値を返すことに気をとられる必要がありません。 一連の式のうち最後の式の値が関数を呼んだところに返されます。 コンソールで試しにつぎのような式を書いてみて関数のはたらきを確かめましょう。

    (AddXY (AddXY 5 6) 4)