つうか, これは本ものの入門じゃあないんだよね. じゃあなにかというと, Mike Terry の黒帯道場を補完する記事なのですよ. いや, まじで scheme の入門記事を書けるほど解ってたら, こんなところで しょうもない記事書いてないって.
(Wilber)「李老師, なぜですか? 機能があまりにも違いすぎる!」
(李書文)「これが script-fu だ」
(Wilber)「script-fu .....」
(李書文)「他人が drag したり click したり , 毎日あらゆるマウスでカチカチをやっている間に, 絶対的な script-fu を養うんだ」
-中略-
(Wilber)「ただ一つの関数を三年間も....」
(李書文)「wilber よ. 古人は 千招(多くの関数)を知るものをおそれず. 一招(一つの関数)に熟練するものをおそれよ といった. まさにこのことを言っているのだ」
-中略-
(先輩)「いったい, 今までどうしていたんだ?」
(李書文)「car, cdr, cons .....」
(先輩)「これまでずっとか?」
(李書文)「はい」
(先輩)「わしらはおまえが来なくなってからずいぶんと scheme の関数を習ったがのう.」
(李書文)「糖衣構文をですか?」
(先輩)「その増上慢, もう許せん!! while 文が糖衣構文かどうか, eval してみようではないか!!」
李書文の GIMP の script-fu のすごさは, やがて Internet に広まり, 多くの hacker がソースを求めた. しかし, 李書文は一度として bug を出すことなく いつしか 「wizard 李書文」 と呼ばれるようになった.
どうじゃ. おもしろそうじゃろう(若干脚色してある). ただちに読むのじゃ. むふー. 中国武術は偉くなっても黒帯とは何の関係もないが, あっちの人はそんなの区別つかないわけで, なんでも格闘技の達人は黒帯 つうか black belt だから, どうも「Mike Terry の黒帯道場」 なのらしい. ちなみに, car, cons, cdr ばっかり修行しても script-fu を書けるようには ならんような気がする. それから, 関数は沢山知っている方が良いかも.
なんか長い前フリですまん. えー. まずですね. LISP 系は一行も書いたことねえ, emacs-lisp なんかも, まるきり暗号と同じです. っつう人は, GUM すなわち Gimp Users Manual の Mike Terry の Script-fu 黒帯道場 を先に読んでくれっす. そして, その記事を 4/5 くらい読んでくれ. script-fu-register という関数が紹介されているところまでだ. わしはそこで書き始めてしまったので, 残りを読んでないのじゃが.
そうだなあ. あと, GIMP を使った経験があるていど無いと, 厳しいかも. つうのは, 何ができるかわかんないでは, 書きたいプログラムも 思い浮かばないでしょう. だから, 全く未経験者ってひとには申し訳ないが, baby please come back, maybe next week みたいな.
そんなわけで, あるていど GIMP の経験がある人向けの, ポスト 黒帯道場. みたいな記事がコレだ.
ところが実際にはそうじゃないんだ. (いや, そうではあるんだけどね) たとえば,
(set! img (gimp-image-new 100 100 0)) (gimp-display-new img)
ふつうは, これで大丈夫だとおもうじゃないですか. emacs lisp なんかでも バッファを返す関数なんかがあったら, それをそのまま setq してオッケーでしょう. それからいったら, これで これで 100x100 の RGB 画像ができるはずではないですか. もしそうだったら, ここでそんなことを書くわけ無いんじゃよ. これをそのまま実行すると, wrong type argument でコケるんじゃよ. script-fu では
(set! img (car (gimp-image-new 100 100 0))) (gimp-display-new img)
こう書かないとダメなのじゃ. もう, あらゆる car である. wrong type argument でエラーになり, どっかで gimp-hogefuga を使ってたら, まずこれを疑おう. この仕様が, 非常に直観に反しているので, 判っていてもつい間違えるんじゃ. そんなの俺だけか? とにかく, これはなんとかしていただきたいものです. こんなの俺にはとてもじゃないが, 直せません. ちなみに, hollywood branch じゃあ直っているようですが, ドキュメントを 見ただけで試してないので実際にどうなのか,までは判りません.
あと, これはどっちかというとドキュメントの問題なのじゃが, DB ブラウザで array と書いてあっても list だったり, 本当に array だったりするので, なんとかしてください. これも相当具合わるいです. array だと思って aref 使ったてエラーになったら, car 使ってみよう. つうか, そんな試行錯誤でデータ型を探るの止めたいんですけど.
俺は, とりあえず, それで, ソースを見に行ったんだ. 馬鹿だから. script-fu のソースに. 一応, あったね. いろんな関数の定義が. interp_slib* というファイルがそれである. でも, 俺はそれを見て関数の使い方が判る程は賢くねえから, 名前でソレと判るもの以外はお手上げだ, と思ったらありました. GUM の後ろの方に. 付録として 全部 (じつは全部じゃないようだが) 載ってます. 懇切丁寧に.
なんと, 逆sin とかそんなのもあるぜ. 何でもあるぜ(そりゃ言いすぎ). これでまともなプログラムが書けるようになったというものです. if も while もありますが, やっぱりここは cond と末尾再帰で 書きたいところじゃのう.
そうそう. script-fu のインタプリタである extension-script-fu が コケてしまうことがよくあります. 変なコードを実行したら, 直ちに GIMPごと即死したりすることもあるが, 大抵の場合は script-fu インタプリタが終了してしまうくらいで助かる. 特に, 1.1 で追加された関数でコケると, わりとインタプリタも死ぬことが 多い.
といっても, script-fu インタプリタが無ければどうせ書けないわけだから, お手上げで, 結局 GIMP ごと再起動するのかというと, そういう必要はなくて, script-fu コンソールを出し, そこに
(extension-script-fu)というのを入力すればいいのだ. これで script-fu インタプリタが復活するであろう. そして開発が続行できるであろう.