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

  

プログラミング言語Schemeの基礎

この記事では、プログラミング言語Schemeの基礎を学びます。 Script-Fuスクリプトを制作する上で知っておかなければならない内容ですので、じっくりと読み進めてください。

なお、Script-Fuスクリプトの制作に必要のない知識については触れていません。 本ウェブサイトはGIMPの学習サイトであり、Schemeの学習サイトではないからです。

  
Schemeは、かなりクセの強いプログラミング言語です。 他の言語でのプログラミング経験がある方も、ここは読み飛ばさないことをオススメします。

四則演算も手続き扱いとなる

Schemeでは、足し算・引き算・掛け算・割り算(つまり四則演算)も手続きとして扱われます。 例えば 1 と 2 と 3 を足す場合には、

(+ 1 2 3)

のように記述します。 情報処理技術者なら『ポーランド記法』を思い出すことでしょう。

  
引き算は -(マイナス)、掛け算は *(アスタリスク)、割り算は /(スラッシュ)で記述します。

では、実際に上のスクリプトを打ち込んでみましょう。 スクリプトファイルから読み込ませるのではなく、Script-Fu コンソールから実行します

1. '(+ 1 2 3)'と打ち込む
1. '(+ 1 2 3)'と打ち込む

上図のようにScript-Fu コンソールを開き、[参照(B)...]ボタンの左側の入力欄に、


(+ 1 2 3)

 

と打ち込んでください。 最後にEnterキーを押すのを忘れないでください

2. Script-Fu コンソールの上部に 6 が表示される
2. Script-Fu コンソールの上部に 6 が表示される

上図のようにScript-Fu コンソールの上部に 6 と表示されます。 1 と 2 と 3 が加算された結果です。

空白は適切に

以前の記事でも解説しましたが、手続きと引数の間(および引数と引数の間)には1つ以上の空白(またはタブ)が必要です。 空白やタブの数は、1個 でも 10個 でも 300個 でも構いません。

  
日本語の空白は使えません。 日本語入力はオフにして空白を入力してください。

では、空白を多く入れたスクリプトを打ち込んでみましょう。 引き続き、Script-Fu コンソールからの実行です。

1. '(+      1   2 3   )'と打ち込む
1. '(+ 1 2 3 )'と打ち込む

上図のようにScript-Fu コンソールから、


(+      1   2 3   )

 

と打ち込んでください。

  
上の例の空白の数は、6個 3個 1個 3個 です。 多めに空白を入力すれば、数は何個でも構いません。
2. Script-Fu コンソールの上部に 6 が表示される
2. Script-Fu コンソールの上部に 6 が表示される

上図のようにScript-Fu コンソールの上部に 6 と表示されます。 このように、空白の数を増やしても結果は変わりません

では次に、空白を省いたスクリプトを打ち込んでみましょう。 手続きと引数の間の空白を省略します。

3. '(+1 2 3)'と打ち込む
3. '(+1 2 3)'と打ち込む

上図のようにScript-Fu コンソールから、


(+1 2 3)

 

と打ち込んでみてください。

4. Script-Fu コンソールの上部に "Error: illegal function" が表示される
4. Script-Fu コンソールの上部に "Error: illegal function" が表示される

上図のようにScript-Fu コンソールの上部に "Error: illegal function" と表示されます。 エラーが発生し、スクリプトは実行されませんでした

"+" と "1" の間に空白がないため "+1" という手続きを実行しようとしたのです。 手続き "+1" は存在しないためエラーとなりました。

セミコロン (;) より後ろは無視される

Schemeでは、セミコロン (;) から行末までは『注釈』として扱われます。 記述内容は読み飛ばされ、無視されます。 つまり、人間が見てプログラム内容を理解しやすくするための解説文です。

  
『注釈』は『コメント』とも呼ばれます。 読み飛ばされて無視されるためコンピュータの動作には影響がありません。

では、注釈を入れたスクリプトを実行してみましょう。 ここからは、スクリプトファイルを読み込ませて実行します。 前の記事で作成したスクリプトファイル myscript.scm を以下のように修正してください。

  1. (define (myscript)
  2. (gimp-quit TRUE)
  3. )

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

  13. (script-fu-menu-register
  14. "myscript" ; 対象の関数の名前
  15. "<Image>/Filters" ; メニュー項目の位置
  16. )
 
  
手続き script-fu-registerと手続き script-fu-menu-registerに渡している計9つの引数の全てに注釈を入れています。

変更したら、GIMPにスクリプトファイルを再読み込みさせましょう。

1. フィルター(R) -> Script-Fu(S) -> スクリプトを再読み込み(R)を実行
1. フィルター(R) -> Script-Fu(S) -> スクリプトを再読み込み(R)を実行

上図のようにプルダウンメニューの"フィルター(R) -> Script-Fu(S) -> スクリプトを再読み込み(R)"を実行します。

では、さっそく実行してみましょう。

2. フィルター(R) -> My Scriptを実行
2. フィルター(R) -> My Scriptを実行

上図のようにプルダウンメニューの"フィルター(R) -> My Script"を実行します。 実行した直後に、GIMPが終了したはずです

このようにセミコロン (;) の後ろに何を記述してもGIMPの動作に影響はありません

Script-Fuではブロックコメント(複数行コメント)は使えない

上で説明した、

  1. セミコロン (;) を記述すると行末までが注釈として扱われる

という方法は、『行コメント』と呼ばれます。 Schemeには、複数行にまたがって注釈を記述するための『ブロックコメント』と呼ばれるものもあります。

ブロックコメントは、

#|

で始まり、

|#

で終わります。 ブロックコメントを使うことで、

  1. #| ----------------------------------------------------------
  2. 名称 : myscript
  3. 機能 : GIMPを終了する
  4. 補足 : なし
  5. 注意点 : なし
  6. ---------------------------------------------------------- |#

  7. (define (myscript)
  8. (gimp-quit TRUE)
  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. )

のように複数行にまたがって注釈を記入することができます。

ただし、Script-Fuではブロックコメントは使えません

Script-FuのエンジンはTinySchemeであり、本ウェブサイトの解説で使用しているGIMP 2.10.18ではTinyScheme Version 1.41が組み込まれています。

TinySchemeはプログラミング言語Schemeの第5改訂版(1998年)への準拠を目指しているようですが、ブロックコメントが使えるのは次期仕様である第6改訂版(2007年)です。 よって、第6改訂版に準拠していないTinySchemeではブロックコメントは使えません。

GIMP上でメッセージを表示する方法を学ぶ

この記事の目的は、

  1. プログラミング言語Schemeの基礎を学ぶこと

です。 しかし、ここで少し脱線してGIMP上でメッセージを表示する方法を解説しておきます。 Schemeの基礎からは離れますが、今後の学習にどうしても必要なことなのでここで解説しておきます。

GIMP上でメッセージを表示するには、GIMP専用の手続き(関数) gimp-message を使う必要があります。 手続き gimp-message は1つの引数を受け取り、それをGIMP上でメッセージとして表示します。

では、試しにメッセージを表示してみましょう。 スクリプトファイル myscript.scm を以下のように修正してください。

  1. (define (myscript)
  2. (gimp-message "Hello World!!")
  3. )

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

  13. (script-fu-menu-register
  14. "myscript" ; 対象の関数の名前
  15. "<Image>/Filters" ; メニュー項目の位置
  16. )
 

修正箇所は2行目で、

(gimp-quit TRUE)

を、

(gimp-message "Hello World!!")

に変更しています。 修正したら、スクリプトファイル myscript.scm を再読み込ませて実行してみてください。

1. ウィンドウ下部に Hello World!! と表示される
1. ウィンドウ下部に Hello World!! と表示される

上図のようにウィンドウ下部に "Hello World!!" と表示されます。

このように、いつでも好きな時に好きな内容のメッセージを表示させることができます

データには "型" と呼ばれる種別がある

GIMP上でメッセージを表示する方法がわかったところで、本題であるSchemeの基礎の話に戻りましょう

続いての話題は、"Schemeのデータには型がある" という内容です。 と言われてもピンとこないと思いますが、ひとまずスクリプトファイル myscript.scm を以下のように修正してください。

  1. (define (myscript)
  2. (gimp-message (+ 1 2 3))
  3. )

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

  13. (script-fu-menu-register
  14. "myscript" ; 対象の関数の名前
  15. "<Image>/Filters" ; メニュー項目の位置
  16. )
 

修正箇所は2行目で、

(gimp-message "Hello World!!")

を、

(gimp-message (+ 1 2 3))

に変更しています。 結果はどうなるでしょうか。 ウィンドウ上に 6 と表示されるでしょうか。 さあ、実行してみましょう。

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

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

  1. "Invalid type for argument 1 to gimp-message"

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

  1. "gimp-messageへの引数1の型が無効です"

という意味になります。

  
argument(アーギュメント)は "引数" のことです。 "パラメータ" も "アーギュメント" も、どちらも "引数" のことです。

ではここで、手続き gimp-messageの仕様を確認してみましょう。 引数をいくつ受け取るのか、引数には何を渡すのか、などを確認することが目的です

Script-Fu プロシージャブラウザーから確認しましょう。 Script-Fu プロシージャブラウザーの開き方については以前のこの記事で解説しています。

2. 手続き gimp-messageの詳細が表示される
2. 手続き gimp-messageの詳細が表示される

上図のようにScript-Fu プロシージャブラウザーを開き、gimp-messageを検索します。 この詳細からわかる内容は以下の通りです。

手続きの名前 gimp-message
手続きの機能

ダイアログボックスでメッセージを表示する。

引数の数 1つ
1つ目の引数の名前
1つ目の引数の種別
1つ目の引数の意味
message
STRING
ダイアログボックスに表示するメッセージ
注意点など

メッセージの文字コードは UTF-8 でなければならない。

Script-Fu プロシージャブラウザーで確認した内容から、受け取る引数は1つで、引数の種別はSTRINGだということがわかりました。

STRINGとは文字列のこと

では、STRINGとは何なのでしょうか。 STRINGというのは日本語では 文字列(もじれつ) 文字列(もじれつ) と呼ばれるもので、例えば、

"ABC"

が文字列です。 これは、文字 A と 文字 B と 文字 C がつながったもので、

A B C <終わり>

のように文字のつながりの終わりを示す印があります

文字列と文字は違う

『文字列』と『文字』は違います。 文字列 "A" は文字数は 1 ですが、

A <終わり>

のように終わりを示すものがあります。 一方、ただの文字 A は、

A

だけであり、文字列とは異なります。

エラーの原因は何なのか

Script-Fu プロシージャブラウザーで確認したように、手続き gimp-messageが受け取る引数は STRING というデータ種別でなければなりません。

ではここで、エラーとなったスクリプトの、

(gimp-message (+ 1 2 3))

という記述を思い出してください。 手続き gimp-messageの引数の部分に記述しているのは、

(+ 1 2 3)

という命令です。 ここで重要なのは、手続き gimp-messageに渡されているのは、

(+ 1 2 3)

ではない、ということです。 ちょっと話が難しくなってきました。 大切なことなのでもう一度いいますが、

手続き gimp-messageの引数の部分に記述しているのは

(+ 1 2 3)

ですが、手続き gimp-messageに渡されているのは

(+ 1 2 3)

ではありません。 このスクリプトの、

(gimp-message (+ 1 2 3))

という行は、まず最初に、

(+ 1 2 3)

の部分が実行されます。 結果はもちろん 6 となります。

その結果をふまえて、次に、

(gimp-message 6)

と解釈されて実行されます。 つまり、手続き gimp-messageに渡されているのは 6 なのです。 この 6 は数値であり、文字列どころか文字でさえありません

手続き gimp-messageにはデータ種別が STRING の引数を渡さなければならないのに、数値の 6 が渡されているのです。 これがエラーが発生した原因です。


問題は、手続き gimp-messageに 数値 6 が渡されていることだ、ということがわかりました。 これを文字列に変換しなくてはなりませんが、どうすればいいのでしょうか。

大丈夫、心配はありません。 Scheme言語には最初から用意されているのです。 数値を文字列に変換する手続き(関数) number->stringが。

では、手続き number->stringを利用して数値を文字列に変換するようにスクリプトを修正します。

  1. (define (myscript)
  2. (gimp-message (number->string (+ 1 2 3)))
  3. )

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

  13. (script-fu-menu-register
  14. "myscript" ; 対象の関数の名前
  15. "<Image>/Filters" ; メニュー項目の位置
  16. )
 

修正箇所は2行目で、

(gimp-message (+ 1 2 3))

を、

(gimp-message (number->string (+ 1 2 3)))

に変更しています。 では、実行してみましょう。

3. ウィンドウ下部に 6 と表示される
3. ウィンドウ下部に 6 と表示される

上図のようにウィンドウ下部に 6 と表示されます。 やりました、成功です。

では、今回のスクリプトの、

(gimp-message (number->string (+ 1 2 3)))

という行が、どう解釈され実行されたのか見てみましょう。 まずは、

(+ 1 2 3)

の部分が実行されます。 結果は今までと同じで、もちろん 6 です。

その結果をふまえて、次に、

(number->string 6)

と解釈されて実行されます。 手続き number->stringが数値 6 を受け取っています。

手続き number->stringは数値を文字列に変換する関数ですので、結果は文字列 "6" となります。 その結果により、さらに、

(gimp-message "6")

と解釈されて実行されます。 つまり、無事に手続き gimp-messageに文字列を渡せたということです。

このように、プログラミング言語Schemeが取り扱うデータには "データ型" と呼ばれる種別があります。 手続きに引数を渡す際には、相手の望むデータ型に合わせる必要があります。

  
ここまでの解説で "引数の種別" や "データ種別" と表記していたものは正確には "データ型" と呼ばれます。 これ以降は、"データ型" で統一して表記します。

文字列と文字列をつなげる

手続き number->stringの次は、手続き string-appendについて紹介します。 この関数は、文字列の後ろに別の文字列をつなげるための関数です。

  
文字列の後ろに別の文字列をつなげることを『文字列の連結』といいます。

では、実際に手続き string-appendを使ってみましょう。 スクリプトファイル myscript.scm を以下のように修正してください。

  1. (define (myscript)
  2. (gimp-message (string-append "Number is " (number->string (+ 1 2 3))))
  3. )

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

  13. (script-fu-menu-register
  14. "myscript" ; 対象の関数の名前
  15. "<Image>/Filters" ; メニュー項目の位置
  16. )
 

修正箇所は2行目で、

(gimp-message (number->string (+ 1 2 3)))

を、

(gimp-message (string-append "Number is " (number->string (+ 1 2 3))))

に変更しています。 では、実行してみましょう。

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

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

では、今回のスクリプトの、

(gimp-message (string-append "Number is " (number->string (+ 1 2 3))))

という行が、どう解釈され実行されたのか見てみましょう。 まず、

(+ 1 2 3)

の部分は、もちろん今までと同じ 6 という結果になります。

その結果をふまえて、次に、

(number->string 6)

と解釈されて実行されますが、これも今までと同じで結果は文字列 "6" です。 その結果により、さらに、

(string-append "Number is " "6")

と解釈されて実行されます。 つまり、手続き string-appendに 文字列 "Number is " と 文字列 "6" が渡っています。 手続き string-appendは受け取った2つの文字列をつなげて1つの文字列としますので、結果は文字列 "Number is 6"となります。

それにより最終的に、

(gimp-message "Number is 6")

と解釈されて実行されます。

文字列の一部を抜き出す

続いても文字列に関する手続きを紹介します。 文字列を抜き出すための手続き substringです。

では、実際に手続き substringを使ってみましょう。 スクリプトファイル myscript.scm を以下のように修正してください。

  1. (define (myscript)
  2. (gimp-message (substring "Hello World!!" 0 5))
  3. )

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

  13. (script-fu-menu-register
  14. "myscript" ; 対象の関数の名前
  15. "<Image>/Filters" ; メニュー項目の位置
  16. )
 

修正箇所は2行目で、

(gimp-message (string-append "Number is " (number->string (+ 1 2 3))))

を、

(gimp-message (substring "Hello World!!" 0 5))

に変更しています。 では、実行してみましょう。

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

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

今回修正した行の、

(substring "Hello World!!" 0 5)

という命令は、『文字列 "Hello World!!" の1文字目から長さ5文字分を抜き出せ』という意味になります。 手続き substringに渡す2つ目の引数は抜き出しを開始する位置で、3つ目の引数は抜き出す長さです。

今回の例では2つ目の引数に 0(ゼロ) を渡していますが、0(ゼロ) は1文字目を意味しています。 N文字目から抜き出したいなら、N - 1 を渡します。 1 を引いた数値を渡す必要があります。 3 を渡すと4文字目から、8 を渡すと9文字目から抜き出されます。

二重引用符 (") について

では続いて、二重引用符 (") について説明します。 ここまで解説を先延ばしにしてきましたが、そろそろ頃合いだと思うのでここで説明しておきます。

ここまで読破してきたみなさんなら、もうおわかりでしょう。 二重引用符 (") は、文字列を表現するのに使用します。 前出のスクリプトの、

(gimp-message "Hello World!!")

の、"Hello World!!" がまさに文字列です。

二重引用符 (") で囲むことで、Schemeに『これは文字列ですよ』と教えることになります。 つまり、

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

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

という記述で、手続き script-fu-registerと手続き script-fu-menu-registerに渡している計9つの引数は全て文字列だということがわかります

なお、手続き script-fu-registerの7つ目の引数は "" と記述されていますが、これは空の文字列です。 文字列 "" は、

<終わり>

のように文字のつながりの終わりを示す印しかありません

文字列の中の空白について

続いてのSchemeの基礎に関する話題は、文字列の中の空白についてです。 まずは、スクリプトファイル myscript.scm を以下のように修正してください。

  1. (define (myscript)
  2. (gimp-message "Hello World!!")
  3. )

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

  13. (script-fu-menu-register
  14. "myscript" ; 対象の関数の名前
  15. "<Image>/Filters" ; メニュー項目の位置
  16. )
 

修正箇所は2行目で、

(gimp-message (substring "Hello World!!" 0 5))

を、

(gimp-message "Hello    World!!")

に変更しました。 "Hello" と "World!!" の間の空白を多めに入れています。 では、実行してみましょう。

1. ウィンドウ下部に Hello    World!! と表示される
1. ウィンドウ下部に Hello World!! と表示される

上図のようにウィンドウ下部に "Hello    World!!" と表示されます。 このように、増やした空白も表示されました

前出のスクリプトの、

(+      1   2 3   )

という命令では、空白の数を増やしても動作に影響はありませんでした。 しかし今回は違っており、増やした空白がメッセージに影響しています。 なぜでしょうか。

理由は、今回増やした空白は文字列の中の空白だからです。 つまり、"1つの引数の内部の空白"です。 手続きと引数の間の空白でもなければ、引数と引数の間の空白でもありません。

空白(またはタブ)の数が多くても影響がないのは、手続きと引数の間、または、引数と引数の間の空白のみです

  
セミコロン (;) から行末までの空白ももちろん動作に影響はありません。 注釈として読み飛ばされるためです。

二重引用符 (") をメッセージに含めるには

すでに説明したように、二重引用符 (") は文字列を表現するものです。 つまり、文字列は二重引用符 (") で囲まなければなりません。

では、二重引用符を文字列に含めるにはどうすればいいのでしょうか。 具体的には、

右の記号 " は二重引用符です

のようなメッセージを表示したい場合などです。

文字列の中に二重引用符 (") を含めるには、二重引用符 (") の直前に \(円マーク) を入れます。 たったこれだけです。

  
\(円マーク) は日本のみで使われています。
  
\(円マーク) は英語環境での \(バックスラッシュ) のことです。

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

  1. (define (myscript)
  2. (gimp-message "右の記号 \" は二重引用符です")
  3. )

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

  13. (script-fu-menu-register
  14. "myscript" ; 対象の関数の名前
  15. "<Image>/Filters" ; メニュー項目の位置
  16. )
 

修正箇所は2行目で、

(gimp-message "Hello    World!!")

を、

(gimp-message "右の記号 \" は二重引用符です")

に変更しました。 では、実行してみましょう。

1. ウィンドウ下部に 右の記号 " は二重引用符です と表示される
1. ウィンドウ下部に 右の記号 " は二重引用符です と表示される

上図のようにウィンドウ下部に『右の記号 " は二重引用符です』と表示されます。

  
メッセージが文字化けする場合は、スクリプトファイルの文字コードが UTF-8 になっていることを再確認してください。

このように直前に \(円マーク) を入れることで、二重引用符 (") が持っている文字列を囲む、という本来の意味を失わせることができます。 \(円マーク) には、後ろに続く文字の本来の意味を失わせる、という効果があります。

では円マーク (\) をメッセージに含めるには

\(円マーク) には、後ろに続く文字の本来の意味を失わせる効果があることはわかりました。 では、\(円マーク)を文字列に含めるにはどうすればいいのでしょうか。 具体的には、

右の記号 \ は円マークです

のようなメッセージを表示する場合です。

\(円マーク) には、次に続く文字の本来の意味を失わせる効果があります。 つまり、\(円マーク) を2つ連続させれば、2つ目の \(円マーク) はただの文字になります。 単純なことです。

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

  1. (define (myscript)
  2. (gimp-message "右の記号 \\ は円マークです")
  3. )

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

  13. (script-fu-menu-register
  14. "myscript" ; 対象の関数の名前
  15. "<Image>/Filters" ; メニュー項目の位置
  16. )
 

修正箇所は2行目で、

(gimp-message "右の記号 \" は二重引用符です")

を、

(gimp-message "右の記号 \\ は円マークです")

に変更しました。 では、実行してください。

1. ウィンドウ下部に 右の記号 \ は円マークです と表示される
1. ウィンドウ下部に 右の記号 \ は円マークです と表示される

上図のようにウィンドウ下部に "右の記号 \ は円マークです" と表示されます。

このように \(円マーク) を2つ連続させることで、2つ目の \(円マーク) は特別な効果を失い、ただの文字になります。

次の記事へ

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

  
  

まとめ

Schemeでは、四則演算も手続きとして扱われます。 手続きの種類が関数なのか、四則演算なのかを利用者が気にする必要はありません。

手続き 説明
+ 加算する
- 減算する
* 乗算する
/ 除算する

手続きと引数の間、引数と引数の間には1つ以上の空白(またはタブ)を入れる必要があります。

セミコロン (;) から行末までは注釈として扱われます。 注釈の部分は読み飛ばされて無視されるため、何を記述してもGIMPの動作には影響はありません。 なお、ブロックコメントはScript-Fuでは使えません。

GIMP上でメッセージを表示するためには、手続き gimp-messageを使います。 gimp-messageには文字列を渡す必要がありますので、数値などを表示させる場合は、手続き number->stringを使う必要があります。 また、文字列と文字列を連結する場合は、手続き string-appendを使います。

手続き 説明
gimp-message GIMP上でメッセージを表示する
number->string 数値を文字列に変換する
string-append 文字列と文字列を連結する
substring 文字列の一部を抜き出す

二重引用符 (") は文字列を表現するために使いますが、\(円マーク) を前に置くことで二重引用符 (") そのものを文字列に含めることができます。 同様に \(円マーク) を2つ連続させることで、\(円マーク) を表現することもできます。

なお、Script-Fu プロシージャブラウザーでの引数の表記は以下のような対応になっています。

引数の種別(データ型) 意味
STRING 文字列
 
メニュー