トップ > Script-Fuスクリプトの制作 >
プログラミング言語Schemeの基礎を学ぶ(その2)

  

プログラミング言語Schemeの基礎(続き)

前の記事の『プログラミング言語Schemeの基礎を学ぶ』からの続きです。 引き続き、Script-Fuスクリプトを制作する上で知っていなければならない内容について解説します。

ここからは、さらに踏み込んだ内容について解説します。 "変数" と呼ばれるものが登場します

変数(へんすう)を使ってみよう

ここでは、今まで登場してこなかった 変数(へんすう) へんすう 変数(へんすう) と呼ばれるものが登場します。 変数とは、データを格納することができる入れ物のようなものです

変数が必要な場面

では、入れ物である変数はどのような場面で役に立つのでしょうか。 例えば、全レイヤを対象にレイヤサイズを画像サイズに合わせるスクリプトを制作するとします。 その場合には、

  1. レイヤの数を数えなさい → 3枚
  2. 1枚目のレイヤを画像サイズに合わせなさい
  3. 2枚目のレイヤも画像サイズに合わせなさい
  4. 3枚目のレイヤも画像サイズに合わせなさい

のような指示を出す必要があります。 この指示をスクリプト的に表現すると、

  1. レイヤの数を数えて 変数 layercountに格納しなさい
  2. 変数 layercount枚目のレイヤを画像サイズに合わせなさい
  3. 変数 layercountから 1 を引きなさい
  4. 変数 layercountが 0(ゼロ) でなければ(2)から繰り返しなさい

のようになります。 例えばレイヤの枚数が3枚であれば、

  1. レイヤの数を数えて 変数 layercountに格納しなさい
  2. → 変数 layercountに 3 が格納される
  3. 変数 layercount枚目のレイヤを画像サイズに合わせなさい
  4. → 3枚目のレイヤの画像サイズが調整される
  5. 変数 layercountから 1 を引きなさい
  6. → 変数 layercountは 2 に変化する
  7. 変数 layercountが 0(ゼロ) でなければ繰り返しなさい
  8. → 変数 layercountは 2 なので繰り返す
  9. 変数 layercount枚目のレイヤを画像サイズに合わせなさい
  10. → 2枚目のレイヤの画像サイズが調整される
  11. 変数 layercountから 1 を引きなさい
  12. → 変数 layercountは 1 に変化する
  13. 変数 layercountが 0(ゼロ) でなければ繰り返しなさい
  14. → 変数 layercountは 1 なので繰り返す
  15. 変数 layercount枚目のレイヤを画像サイズに合わせなさい
  16. → 1枚目のレイヤの画像サイズが調整される
  17. 変数 layercountから 1 を引きなさい
  18. → 変数 layercountは 0 に変化する
  19. 変数 layercountが 0(ゼロ) でなければ繰り返しなさい
  20. → 変数 layercountは 0 なので繰り返さずに終了する

のような動作になります。 このように、変数は刻々と変化するデータを保持するために使われます


では、実際に変数を利用してみましょう。 スクリプトファイル myscript.scm を以下のように書き換えてください。

  1. (define (myscript)
  2. (let
  3. (
  4. (outnumber 9)
  5. )

  6. (gimp-message (string-append "Number is " (number->string outnumber)))
  7. )
  8. )

  9. (script-fu-register
  10. "myscript" ; 登録する関数の名前
  11. "My Script" ; メニュー項目のラベル
  12. "自作の練習用スクリプトです" ; メニュー項目の説明
  13. "My Name" ; 作成者の名前
  14. "My Name" ; 著作権者の名前
  15. "January 1, 2023" ; 作成日(改訂日)
  16. "" ; メニュー項目を有効にするための条件
  17. )

  18. (script-fu-menu-register
  19. "myscript" ; 対象の関数の名前
  20. "<Image>/Filters" ; メニュー項目の位置
  21. )
 

注目すべきは2行目から8行目の、

(let
    (
        (outnumber 9)
    )

    (gimp-message (string-append "Number is " (number->string outnumber)))
)

という部分です。 詳細については後ほど解説しますので、ひとまず実行してください。

1. ウィンドウ下部に "Number is 9" と表示される
1. ウィンドウ下部に "Number is 9" と表示される

上図のようにウィンドウ下部に "Number is 9" と表示されます。


では、変更点をじっくり見ていきましょう。 変更後のスクリプトは、

  1. (define (myscript)
  2. (let
  3. (
  4. (outnumber 9)
  5. )

  6. (gimp-message (string-append "Number is " (number->string outnumber)))
  7. )
  8. )

  9. (script-fu-register
  10. "myscript" ; 登録する関数の名前
  11. "My Script" ; メニュー項目のラベル
  12. "自作の練習用スクリプトです" ; メニュー項目の説明
  13. "My Name" ; 作成者の名前
  14. "My Name" ; 著作権者の名前
  15. "January 1, 2023" ; 作成日(改訂日)
  16. "" ; メニュー項目を有効にするための条件
  17. )

  18. (script-fu-menu-register
  19. "myscript" ; 対象の関数の名前
  20. "<Image>/Filters" ; メニュー項目の位置
  21. )

となっており、見ての通り2行目から8行目が、

(let
    (
        (outnumber 9)
    )

    (gimp-message (string-append "Number is " (number->string outnumber)))
)

のように、大幅に変更されています。 この変更点で最も目立っているのが、2行目、つまり変更部分の一番外側のカッコに続く let です

let はカッコの直後に記述されていることから『手続き』だということがわかります。 初めて見る手続き letが登場しました。 手続き letとは一体何者なんでしょうか。

手続き letとは

手続き letは、変数を宣言し、さらに、使用するためのものです。 今回のスクリプトの変更部分である、

(let
    (
        (outnumber 9)
    )

    (gimp-message (string-append "Number is " (number->string outnumber)))
)

の場合には、

(
    (outnumber 9)
)

の部分が変数を宣言している箇所です。 letの次のカッコから対となるカッコで囲まれている部分が変数の宣言部分になります。

それ以降の、

(gimp-message (string-append "Number is " (number->string outnumber)))

が変数を使用している部分です。 手続き number->stringに変数 outnumberを渡している以外は目新しい記述はありません。


手続き letが、

  1. 変数の宣言
  2. 変数の使用

で構成されていることがわかりました。 では、もう少し詳しく見ていきましょう。

まず、変数の宣言の部分は、

(
    (outnumber 9)
)

と記述されています。 これは、『変数 outnumberを用意し、初期値として 9 をセットしなさい』という意味です。

『初期値』というのは、変数が用意された時点で格納されるデータです。 今回の例では、変数 outnumberには 9 が格納された状態から始まります

なお、カッコが二重になっていますが、外側のカッコで囲まれている部分は命令ではありません。 前述のように、手続き letを使って変数を宣言する場合は宣言部分をカッコで囲むという決まりがあります

内側の "(outnumber 9)" が、変数の名前と初期値を記述している部分です。 今回の例では、変数名が outnumber で 初期値が 9 となります。

  
初期値は必ず指定しなければなりません。 "(outnumber)" のように初期値の指定をせずに宣言することはできません。

続いて、変数の使用の部分は、

(gimp-message (string-append "Number is " (number->string outnumber)))

のように記述されています。 これは、『変数 outnumberの中身を文字列に変換して先頭に "Number is " を付加したものをメッセージとして表示せよ』という意味です。

なお、変数 outnumberは初期値を 9 として宣言しました。 よって、この変数 outnumberの現時点でのデータ型は数値となります。 そのため、手続き number->stringによる数値から文字列への変換が必要というわけです。

  
今回の例では、変数の使用の部分にはメッセージを表示するための1つの命令しか記述していませんが、ここには複数の命令を記述することもできます。

変数の中身を置き換えてみよう(代入してみよう)

続いても変数に関する話題です。 すでに説明したように、変数は刻々と変化するデータを保持するために使われます。 つまり、変数に格納されているデータは自由に置き換えることができるということです。

では、実際に変数の中身を置き換えてみましょう。 スクリプトファイル myscript.scm を以下のように修正します。

  1. (define (myscript)
  2. (let
  3. (
  4. (outnumber 9)
  5. )

  6. (set! outnumber 88)

  7. (gimp-message (string-append "Number is " (number->string outnumber)))
  8. )
  9. )

  10. (script-fu-register
  11. "myscript" ; 登録する関数の名前
  12. "My Script" ; メニュー項目のラベル
  13. "自作の練習用スクリプトです" ; メニュー項目の説明
  14. "My Name" ; 作成者の名前
  15. "My Name" ; 著作権者の名前
  16. "January 1, 2023" ; 作成日(改訂日)
  17. "" ; メニュー項目を有効にするための条件
  18. )

  19. (script-fu-menu-register
  20. "myscript" ; 対象の関数の名前
  21. "<Image>/Filters" ; メニュー項目の位置
  22. )
 

修正箇所は7行目で、

(set! outnumber 88)

という行が新たに追加されています。 新たな手続き set! が登場していますが、ひとまず実行してみましょう。

1. ウィンドウ下部に "Number is 88" と表示される
1. ウィンドウ下部に "Number is 88" と表示される

上図のようにウィンドウ下部に "Number is 88" と表示されます。


では、変更点を見ていきましょう。 変更点は、

(set! outnumber 88)

という行のみです。 新たな手続き set! が登場しています。

手続き set!とは

手続き set!は、変数の中身を別の値で置き換えるためのものです。 それまで変数に格納されていた値を捨て、新たな別の値を格納します

なお、変数の中身を置き換えること 代入(だいにゅう) だいにゅう 代入(だいにゅう) といいます。 手続き set!は、変数に値を代入するために使います。

最初の引数が変数名で、2つ目の引数が新たに代入する値です


つまり、

(set! outnumber 88)

は、『変数 outnumberに 88 を代入しなさい』という意味になります。 それまで変数 outnumberには 9 が格納されていましたが、これが 88 で置き換えられます。 よって最終的に、"Number is 88" というメッセージが表示されました。

変数から変数に代入してみよう

続いても変数の代入に関する話題ですが、今回は代入元も変数の場合について解説します。 つまり、変数から変数への代入です。

では、変数から変数に代入してみましょう。 スクリプトファイル myscript.scm を以下のように修正します。

  1. (define (myscript)
  2. (let
  3. (
  4. (outnumber 9)
  5. (innumber outnumber)
  6. )

  7. (set! outnumber 88)

  8. (gimp-message (string-append "Number is " (number->string innumber)))
  9. )
  10. )

  11. (script-fu-register
  12. "myscript" ; 登録する関数の名前
  13. "My Script" ; メニュー項目のラベル
  14. "自作の練習用スクリプトです" ; メニュー項目の説明
  15. "My Name" ; 作成者の名前
  16. "My Name" ; 著作権者の名前
  17. "January 1, 2023" ; 作成日(改訂日)
  18. "" ; メニュー項目を有効にするための条件
  19. )

  20. (script-fu-menu-register
  21. "myscript" ; 対象の関数の名前
  22. "<Image>/Filters" ; メニュー項目の位置
  23. )
 

修正箇所は2箇所あります。 1箇所目は5行目で、

(innumber  outnumber)

という行が新たに追加されています。 これは、『変数 innumberを用意し、初期値にはoutnumberの中身を入れなさい』という意味です。

2箇所目は10行目で、

(gimp-message (string-append "Number is " (number->string outnumber)))

を、

(gimp-message (string-append "Number is " (number->string innumber)))

に変更しています。 今までは変数 outnumberの中身を表示していましたが、これを変更し変数 innumberの中身を表示するようにしています。

それでは、実行してみましょう。 ウィンドウ下部に "Number is 9" と表示されることを期待して。

1. エラーが発生する
1. エラーが発生する

上図のようにエラーが発生します。 エラー内容は、

  1. "eval: unbound variable: outnumber"

となっています。 エラー内容を直訳すると、

  1. "outnumberは未宣言の変数です"

という意味になります。 つまり、『変数 outnumberが見つからない』と言ってます。 『何を言っているんだコイツは』とお思いでしょうが、Script-Fuは間違っていません。 変数 outnumberは確かに見つかりません。

変数 outnumberが見つからない理由は、

(innumber  outnumber)

の記述が、変数 outnumberの宣言部分と同じ場所だからです。 すでに何度も説明しているように、letの次のカッコから対となるカッコで囲まれている部分である、

(
    (outnumber 9)
    (innumber  outnumber)
)

は、変数の宣言部分です。 この宣言部分の中で宣言した変数は、宣言部分より後方でしか参照することができないのです

変数 outnumberは、変数 innumberと同じ宣言部分で宣言されています。 つまり、この時点では変数 outnumberは存在していないのと同じなのです。

説明するのが難しいので、スクリプト全体を見ながら解説します。 以下にスクリプトを再掲載しますので、詳しく見てみましょう。

  1. (define (myscript)
  2. (let
  3. (
  4. (outnumber 9)
  5. (innumber outnumber)
  6. )

  7. (set! outnumber 88)

  8. (gimp-message (string-append "Number is " (number->string innumber)))
  9. )
  10. )

  11. (script-fu-register
  12. "myscript" ; 登録する関数の名前
  13. "My Script" ; メニュー項目のラベル
  14. "自作の練習用スクリプトです" ; メニュー項目の説明
  15. "My Name" ; 作成者の名前
  16. "My Name" ; 著作権者の名前
  17. "January 1, 2023" ; 作成日(改訂日)
  18. "" ; メニュー項目を有効にするための条件
  19. )

  20. (script-fu-menu-register
  21. "myscript" ; 対象の関数の名前
  22. "<Image>/Filters" ; メニュー項目の位置
  23. )

まず、2行目に手続き letがあります。 そのため、その直後の3行目のカッコは変数の宣言部分の始まりであるとみなされます。 なお、宣言部分の終わりは6行目にあるカッコです。

続いて4行目では、変数 outnumberが宣言されています。 初期値は 9 が格納されます。 ただし、この時点では変数はまだ有効になっていません。 宣言した変数が有効になるのは、宣言部分の終わりである6行目のカッコの直後です

問題の5行目では、変数 innumberが宣言されます。 初期値には変数 outnumberの中身を格納しようとしていますが、変数 outnumberはまだ有効にはなっていません。 そのため、変数 outnumberは未宣言だと怒られたのです。

  
詳しく知りたい方は『変数束縛』で検索してください。

エラーの原因はわかりました。 では、どうやって解決すればいいのでしょうか。 思いつく方法は3つありますので、それぞれ解説します。

解決方法その1 手続き letを入れ子にする

最初に紹介する方法は、手続き letを『入れ子』にする方法です。 入れ子(いれこ) いれこ 入れ子(いれこ) とは、ある構造の中に同じ構造のものを収めることをいいます。 例えば、ロシアのマトリョーシカ人形が入れ子になります。

  
プログラミングの世界では、入れ子は『ネスト』とも呼ばれます。

今回の例では、手続き letのカッコの中に別のletを入れます。 letの中にletを入れるから『入れ子』です。

実際に修正して実行してみましょう。 スクリプトファイル myscript.scm を以下のように修正してください。

  1. (define (myscript)
  2. (let
  3. (
  4. (outnumber 9)
  5. )

  6. (let
  7. (
  8. (innumber outnumber)
  9. )

  10. (set! outnumber 88)

  11. (gimp-message (string-append "Number is " (number->string innumber)))
  12. )
  13. )
  14. )

  15. (script-fu-register
  16. "myscript" ; 登録する関数の名前
  17. "My Script" ; メニュー項目のラベル
  18. "自作の練習用スクリプトです" ; メニュー項目の説明
  19. "My Name" ; 作成者の名前
  20. "My Name" ; 著作権者の名前
  21. "January 1, 2023" ; 作成日(改訂日)
  22. "" ; メニュー項目を有効にするための条件
  23. )

  24. (script-fu-menu-register
  25. "myscript" ; 対象の関数の名前
  26. "<Image>/Filters" ; メニュー項目の位置
  27. )
 

スクリプトファイルを修正したら、実行してみましょう。

2. ウィンドウ下部に "Number is 9" と表示される
2. ウィンドウ下部に "Number is 9" と表示される

上図のようにウィンドウ下部に "Number is 9" と表示されます。 期待通りの結果を得ることができました

では、修正したスクリプトについて解説します。 以下にスクリプトを再掲載しますので、詳しく見てみましょう。 なお、手続き script-fu-registerの部分は省略しています。

  1. (define (myscript)
  2. (let
  3. (
  4. (outnumber 9)
  5. )

  6. (let
  7. (
  8. (innumber outnumber)
  9. )

  10. (set! outnumber 88)

  11. (gimp-message (string-append "Number is " (number->string innumber)))
  12. )
  13. )
  14. )

letの中にletを入れました。 2行目から16行目までが親のletで、7行目から15行目までが子のletです。 注目すべきは、変数 outnumberは親のlet内で宣言され、変数 innumberは子のlet内で宣言されていることです。

親のletの中で宣言された変数 outnumberは、5行目のカッコの直後に有効になります。 よって、子のletの中では変数 outnumberを参照することができるのです。 結果、9行目で変数 innumberを宣言し、初期値として変数 outnumberの値を格納することができました。

解決方法その2 変数の宣言部分の外で代入する

続いて紹介するのは、

  1. 変数から変数への代入を変数の宣言部分よりも後ろに記述する

という方法です。 変数から変数への代入の記述をもっと後ろにずらす、ということです。

では、スクリプトファイル myscript.scm を以下のように修正してください。

  1. (define (myscript)
  2. (let
  3. (
  4. (outnumber 9)
  5. (innumber 0)
  6. )

  7. (set! innumber outnumber)

  8. (set! outnumber 88)

  9. (gimp-message (string-append "Number is " (number->string innumber)))
  10. )
  11. )

  12. (script-fu-register
  13. "myscript" ; 登録する関数の名前
  14. "My Script" ; メニュー項目のラベル
  15. "自作の練習用スクリプトです" ; メニュー項目の説明
  16. "My Name" ; 作成者の名前
  17. "My Name" ; 著作権者の名前
  18. "January 1, 2023" ; 作成日(改訂日)
  19. "" ; メニュー項目を有効にするための条件
  20. )

  21. (script-fu-menu-register
  22. "myscript" ; 対象の関数の名前
  23. "<Image>/Filters" ; メニュー項目の位置
  24. )
 

5行目で、変数 innumberの初期値を 0(ゼロ) にしています。 そして、変数 outnumberが有効になった後の8行目で、変数 outnumberから変数 innumberに代入しています。

スクリプトファイルを修正したら、実行してみましょう。

3. ウィンドウ下部に "Number is 9" と表示される
3. ウィンドウ下部に "Number is 9" と表示される

上図のようにウィンドウ下部に "Number is 9" と表示されます。 解決方法1と同じように期待通りの結果を得ることができました。

解決方法その3 手続き let*の利用

最後に紹介するのは、

  1. 手続き letではなく手続き let*を利用する

という方法です。 手続き letではなく、よく似た手続き let*を利用します。 手続き let*では、変数が1つ宣言されるごとにその変数が有効になります。

では、実際に修正してみましょう。 スクリプトファイル myscript.scm を以下のように修正しましょう。

  1. (define (myscript)
  2. (let*
  3. (
  4. (outnumber 9)
  5. (innumber outnumber)
  6. )

  7. (set! outnumber 88)

  8. (gimp-message (string-append "Number is " (number->string innumber)))
  9. )
  10. )

  11. (script-fu-register
  12. "myscript" ; 登録する関数の名前
  13. "My Script" ; メニュー項目のラベル
  14. "自作の練習用スクリプトです" ; メニュー項目の説明
  15. "My Name" ; 作成者の名前
  16. "My Name" ; 著作権者の名前
  17. "January 1, 2023" ; 作成日(改訂日)
  18. "" ; メニュー項目を有効にするための条件
  19. )

  20. (script-fu-menu-register
  21. "myscript" ; 対象の関数の名前
  22. "<Image>/Filters" ; メニュー項目の位置
  23. )
 

手続き letを手続き let*に変更しました。 手続き let*に変更したことで、4行目で宣言されている変数 outnumberは宣言の直後に有効になります。 よって、5行目で変数 outnumberを参照してもエラーとはなりません。

スクリプトファイルを修正したら、実行してみましょう。

4. ウィンドウ下部に "Number is 9" と表示される
4. ウィンドウ下部に "Number is 9" と表示される

上図のようにウィンドウ下部に "Number is 9" と表示されます。 解決方法1・2と同じようにウィンドウ下部に "Number is 9" と表示させることができました。

関数を作ってみよう

続いては、変数の話題からは離れて "関数" に関する話題に移ります。 ここでは、新たな関数を作成してみます

以前の記事で説明したように、関数は手続きの種類の一つです。 例えば、

(gimp-message "Hello World!!")

という記述では、手続き gimp-messageが関数です。

また、

(gimp-quit TRUE)

では、手続き gimp-quitが関数です。

関数はすでに作成済み

ここまで読み進めてきたみなさんは、実はすでに関数を作成しています。 例えば前回実行した、

  1. (define (myscript)
  2. (let*
  3. (
  4. (outnumber 9)
  5. (innumber outnumber)
  6. )

  7. (set! outnumber 88)

  8. (gimp-message (string-append "Number is " (number->string innumber)))
  9. )
  10. )

  11. (script-fu-register
  12. "myscript" ; 登録する関数の名前
  13. "My Script" ; メニュー項目のラベル
  14. "自作の練習用スクリプトです" ; メニュー項目の説明
  15. "My Name" ; 作成者の名前
  16. "My Name" ; 著作権者の名前
  17. "January 1, 2023" ; 作成日(改訂日)
  18. "" ; メニュー項目を有効にするための条件
  19. )

  20. (script-fu-menu-register
  21. "myscript" ; 対象の関数の名前
  22. "<Image>/Filters" ; メニュー項目の位置
  23. )

というスクリプトでは、1行目から12行目が関数です。 1行目からわかる通り、関数の名前は "myscript" です。


ここでは新たな関数を作成しますが、ここでいう新たな関数とは、関数 myscriptとは別の関数であり、新たな関数は、

  1. 関数 myscriptから実行される

という位置づけです。 プルダウンメニューの"フィルター(R) -> My Script"を実行すると関数 myscriptが実行され、そこからさらに新たな関数が呼ばれる、という流れです。

では、新たな関数を作ってみましょう。 作成する新たな関数は、受け取った2つの数値を加算して返すという機能を持つ関数です。 スクリプトファイル myscript.scm を以下のように書き換えます。

  1. (define (myscript)
  2. (let*
  3. (
  4. (outnumber 9)
  5. (innumber outnumber)
  6. )

  7. (set! outnumber (myfunc-addnumber 10 20))

  8. (gimp-message (string-append "Number is " (number->string outnumber)))
  9. )
  10. )

  11. (define (myfunc-addnumber x y)
  12. (+ x y)
  13. )

  14. (script-fu-register
  15. "myscript" ; 登録する関数の名前
  16. "My Script" ; メニュー項目のラベル
  17. "自作の練習用スクリプトです" ; メニュー項目の説明
  18. "My Name" ; 作成者の名前
  19. "My Name" ; 著作権者の名前
  20. "January 1, 2023" ; 作成日(改訂日)
  21. "" ; メニュー項目を有効にするための条件
  22. )

  23. (script-fu-menu-register
  24. "myscript" ; 対象の関数の名前
  25. "<Image>/Filters" ; メニュー項目の位置
  26. )
 

注目すべき箇所は3箇所あります。 1箇所目は14行目から16行目で、

(define (myfunc-addnumber x y)
    (+ x y)
)

という見慣れない記述があります。 この部分が新たな関数を定義している部分であり、関数の名前は "myfunc-addnumber" です。

この関数は引数を2つ受け取りますが、14行目のx と y というのが受け取る引数に付ける名前になります。 15行目の (+ x y) の部分が受け取った2つの引数を加算している部分です。

2箇所目は8行目で、

(set! outnumber 88)

を、

(set! outnumber (myfunc-addnumber 10 20))

に変更しています。 今までは変数 outnumberに 88 を代入していましたが、これを変更し (myfunc-addnumber 10 20) の結果を代入するようにしました。

つまり、新たな関数 myfunc-addnuberに 10 と 20 の2つの引数を渡して加算させた結果が代入されます。

3箇所目は10行目で、

(gimp-message (string-append "Number is " (number->string innumber)))

を、

(gimp-message (string-append "Number is " (number->string outnumber)))

に変更しています。 今までは変数 innumberの中身を表示していましたが、これを変更し変数 outnumberの中身を表示するようにしています。


では実行してみましょう。

1. ウィンドウ下部に "Number is 30" と表示される
1. ウィンドウ下部に "Number is 30" と表示される

上図のようにウィンドウ下部に "Number is 30" と表示されます。

では、今回のスクリプトがどう解釈され実行されたのか見てみましょう。 まずは、

(set! outnumber (myfunc-addnumber 10 20))

の部分は、変数 outnumberに、

(myfunc-addnumber 10 20)

の結果を代入する、と解釈されます。 ではここで、関数 myfunc-addnumberを見てみましょう。 関数 myfunc-addnumberは、

(define (myfunc-addnumber x y)
    (+ x y)
)

と定義されています。 受け取った2つの引数 10 20 がそれぞれ、x y に対応します。 さらに、関数 myfunc-addnumberの内部では、

(+ x y)

という命令が記述されています。 x と yを加算しろ、という命令なので結果は 30 になります。

その結果により、

(set! outnumber (myfunc-addnumber 10 20))

は、

(set! outnumber 30)

と解釈され、変数 outnumberには 30 が代入されます。 その結果、最終的に、"Number is 30" というメッセージが表示されました。

次の記事へ

長くなってきましたので、この辺で一区切りしましょう。 続きは次の記事を参照ください

  
  

まとめ

変数は、刻々と変化するデータを保持することのできる入れ物のようなものです。 なお、変数に最初に格納される値を初期値といいます。

変数は、手続き letの内部で宣言および使用することができます。 手続き letの直後のカッコの中で変数を宣言し、その後方で変数を使用します。

手続き letでは、変数の宣言部分が終わった時点で、内側で宣言されていた変数群がまとめて有効になります。 一方、よく似た手続き let*では、変数が1つ宣言されるごとにその変数が有効になります。

手続き 説明
let 変数を宣言し使用する
※変数が有効になるのは宣言部分の直後
let* 変数を宣言し使用する
※都度変数が有効になる

初期値が格納済みの変数に別のデータを格納することを代入といいます。 代入には手続き set!を使用します。

手続き 説明
set! 変数に値を代入する

手続きの種類の1つである関数は、いつでも誰でも自由に作成することができます。

手続き 説明
define 独自の関数を定義する
メニュー