GimpでのScheme

 Gimpで動作するスクリプト言語Scheme入門風の内容を考えています。

リスト --- List ---
リスト定数 --- quote ---

リスト --- List ---

 SchemeLisp を発展させた言語です。Lisp といえばリスト処理言語、括弧のかたまりと言われていますが、これは、Scheme についても言えることです。
 では、リストとはどんなものでしょうか?

( a b c 1 2 3)

 Scheme ではリストを上のように書きます。リストは要素を順番に並べたもので、全体を「()」で囲んだものです。上の例は、a b c 1 2 3 という6個の要素を順に並べたリストです。
 要素は、名前(変数名や関数名のようなもの)や数値、文字列など、さまざまです。さらにリストそのものを要素とすることが出来ます。

( a b ( x y z ) 1 2 3)

 上の(外側の)リストの要素は6個。三番目の要素はリスト( x y z )です。
 このように簡単な規則で、複雑な構造をあらわせるのがリストです。

 Scheme (そして Lisp も)は、プログラムもこのリストを使って書き表します。とても簡単なプログラムを示します。

( + 1 2)

 プログラムとして実行するとき、リストは、最初の要素が関数、二番目以降が関数に与える引数と解釈されます。上のプログラムでは「+」が関数(加算を表す)、1 と 2 が引数になります。この例では、1+2 を計算して 3 を値として返します。
 引数の部分が、変数名ならば変数の値、定数ならば定数の値、そして、リストならば、上の規則で関数が呼ばれます。

( + a 2 (* 3 4) )

 一番外側のリストの関数は「+」、引数は 「a」 「2」「 (* 3 4)」。これらの三つを加算した(+)結果が返ります。「+」関数に渡すために引数はあらかじめ「評価」されます。「a」は、変数「a」の値を返します。 「2」は、数値 2そのもの。「 (* 3 4)」はリストなので関数として「評価」されます。関数は「*」(乗算)、引数は「3」「4」なので、3*4 、つまり 12 を返します。
 最終的には、a + 2 + ( 3 * 4 ) が計算されます。
 細かいことを別にするとプログラム動作の原理がこれだけの単純なルールです。


リスト定数 --- quote ---

 プログラムもリストの形で書くことは解ったと思いますが、ここで、ちょっと、困ったことがおきます。
リスト ( a b c ) の二番目以降を取り出す関数として、cdr があります。結果は、リスト ( b c ) になるはずです。では、ちょっと書いてみます。

(cdr (a b c) )

 一見正しいようですが、きちんと順を追ってみると困ったことがおきるのが解ります。
 cdr に与える引数は、(a b c) ですが、これは cdr の実行前に評価されます。つまり、リストの先頭の「a」という関数に、二つの引数、b、c を与えた結果を求め、それを cdr の引数とするわけです。
 cdr に リスト (a b c) を与えるためには、(a b c)の評価をやめさせる必要があります。
 このために、「quote」という関数が用意されています。quote は引数を評価せずに、そのまま返す特殊な関数です。これを使って書くと次のようになります。

(cdr (quote (a b c)) )

 quoteがリスト (a b c) をそのまま返すので、cdr に (a b c) を与えることが出来るようになりました。

 この quote 、あまりにも頻繁に用いるので、略記法が用意されています。「'」(シングル・クォート)を引数の前に書くだけで評価が止まり、見た目そのままのリストを表せます。上の例でしたら、次のように書きます。

(cdr '(a b c) )

 「'」を前に付けた要素は評価されないで、見た目そのままを表す、言わば、定数のように扱われます。


アルゴ算法堂へ戻る