recursive に行こう


いや, まじで lisp でモノ書くのってオモロイす. 学部のときに課題で scheme やらされたときは 頭ハゲるかと思いましたが, マジ. これは最強にオモロイっす.

最初は GIMP の script-fu だったんすよ. lisp 系のデビューは. あれは scheme で, emacs lisp とは若干違うところがあります. まあ, だいたい同じですけど.

script-fu も, かなーりオモシロイんですが, やや作れるもののユーザインタフェースが ちょっとショボいみたいなんで, そこらへんをなんとかして欲しいところですね. たとえば, ダイアログにある入力フィールドに値を入れたら, 関連するフィールドには自動的に入力されたり, 値が変わったりしてほしいっす. サイズの変更ダイアログで上下比を保つような場合などにね.

あと, lisp 系ですから, エラー処理が各関数任せなんすけど, その, 関数によってメッセージの品質に相当なバラつきがありまして(笑). 他には, 変な引数で呼ぶと二度と帰って来ないとか. 本体の振舞が怪しくなったり. お約束の GIMP ごとブっとぶのも. 特に, 1.1 で増えた関数とかで. もう治ってんのかなあ.

emacs lisp には, こっちはこっちで若干不満が無くもない. まあ, でも, これに関してはあちこちでいろいろ言われているので, 今さら私が言うことも無いでしょう.

でも, 一つだけ. let ステ (笑)

script-fu では普通(?)の let が elisp の let* と同じように使えるんで, ちょっと混乱の元かも.

プログラミングってやらされるとこんなにせつないもんは無いすが, 勝手にやる分には, マジでおもろいっす. といっても, 今書いてるコードはケソキュウ絡みですけど. まあでも, 手でやったらいつまでかかるかわかんねい計算が pentium 様 のパワーで一瞬で終わるってのは, 悪くないす.

それに, tex で数式を書くとかいっても, アレって実際には単なる文字列で, 数式じゃないっすよね. つまり, 数式で足し算を tex で書いても, そこから足し算ができたりは しないじゃないすか. でも, これってけっこうせつない事だと思いません? しかし, tex で書いた数式を計算させる, なんてことも, emacs ならできるわけですな. ああ, emacs で良かった! (←大声で) ちゅうか, マジで, emacs 一族を書いた方々には ノーベル・コンピュータ賞を差し上げたいね!

Abelson & Sussman の scheme 本は, 第2版が今年 (2000年) になって 別の本やから違う訳者で出てるそうです. 友達にメールで教えてもらいました. どうもありがとうございます > 渋谷君

こんなにオモロイ LISP 系ですが, 喰わず嫌いな人も多いと聞きます. 私もそうだったんですが. .emacs をいじるのは, 何か新しい lisp パケジをインストールした 時だけ, ドキュメントに書いてある通りにイジるって人も 居るでしょう.

そういう人に, LISP を始める御案内をば. すなわち,

LISP 系にはまろう HOWTO

とりあえずやってみるのが正解 (←またそれかよ). いや, まじで. emacs 起動すると最初に開いてるのが *scratch* バッファですよね. これは lisp コードをラクガキ (scratch) するための バッファです. 最初, 良く解ってなかった頃は, 「なんなら このバッファ. ワケわからんぞ. 要らネ!」 と不敬なことを思ってましたが, 実は, このバッファは最高にイカすんです. とりあえず, 電卓がわりになるぞ. (+ 1 2 3 4 5 6 7 8 9) とか書いて, 行末で Ctrl j をタイプしてみよう. おお! 計算されるぜ! (私は, shell があるときは bc を使い, emacs があるときは scratch バッファを電卓がわりにします. )

つまり, このバッファに LISP のコードをじかに書いて, 実行できるんですな. 便利ですな. とりあえず書き始めてみるとか, 書き中のコードの怪しい部分を抜いて来て別途テストするとか, いろんな使い方ができます.

とはいえ, 最初は何書いていいか, 勝手が全然わかんないから, やっぱり手引書とか欲しいわけでして. 出だしのところである程度 「何がやりたい(できる)のか」と「どうすればできるのか」 を, 同時に掴ませてくれないと, 離陸しにくいもんですからね. ところがよくしたもので, そんな人のために GNU の ftp サイトに emacs lisp の入門用 info というのが 置いてあるんですよ. ちょっと古いのですが, これがわりと解りやすくて良かったです. 演習なんかも載ってるんですが, 不満があるとすれば, その演習が やってみる気が失せるほど簡単なことすかね. でも, 英語なんすけど.

2000/09/29 に、再び kadu 様からのフォローがありました。 上記入門 info には、なんと和訳があるそうです。 ftp://ftp.ascii.co.jp/pub/GNU/emacs-lisp-intro-jp.texi 英語はアレだという方は、こっちをお試しになってはいかがでしょう。 あと、文末に 優しい Emacs-Lisp 講座 をお勧めサイトとして追加しましたが、 これも kadu 様からの情報です。 いつもありがとうございます。> kadu 様

これを見ながら scratch バッファにラクガキしていると, すぐコツが掴めます. なんせ, LISP は憶えることが少ないんです. 憶える事といったら これくらいっすよ.

まあ, あと, 普通に if とか while もありますが, こいつらはありがちな言語みたいに予約語とかの特殊な立場じゃなくって, せいぜい毛色の違う関数ってところですから, あとは その場で help 見りゃ十分っす.

でも, 実は難しいところもあるんですよ. 特に, 上記最後二つの, 計算されかたあたりは, 難しいです. 入れ子のカッコは, 処理系によって微妙に違ったりもします. でも, ここは実は面白いところでもあるんです. あなたの ".emacs" にも書いてあるでしょ? "'hoge" っていうのと "fuga" っていうのと `"funi"' っていうのが. こいつらが, どう違うのか, 気になりません? まあでも, その辺をサラっと説明できたら こんなところでラクガキ書いてないってば(笑). だから, こういう難しい話は今回は, 無し. てゆうか無理.

始めたときはなんでもそうなんでしょうが, ヘルプの使い方が, 実際のコードの書き方以上に重要なのじゃ. emacs でも GIMP の script-fu でも, ヘルプ機能が充実してるんで, これを使わない手は無いっす. ヘルプで言えば, emacs のヘルプコマンドっすね.

バッファに

(hogefuga-poo-uoo 

と書き始めたところで, 引数の順番がわかんなくなっちゃったら すぐに describe-function を実行. カーソル位置の関数が, 既にデフォルトで 選ばれているので, 速攻でドキュメントを見れます. describe-function は help-commandのあとに "f" じゃ. help-command はデフォルトでは Ctrl-H だが, 多分, 違うキーに引っ越してあるじゃろ.

これが unix のシェルで言うところの man hoge にあたるわけで, つまり, 「名前が判ってて, 機能を調べる」引き方. しかしながら, 実際にコードを書くときは, その逆向きが非常に重要っすよ. 必死こいて関数を自分で作って, その直後に同じ働きの, もっと速くてバグも無い関数が見つかったりしたら, やる気ゲージがゼロになり, しばらく回復しませんからね.

man コマンドにも逆引き "apropos" がありますが, emacs でも同じく apropos です. M-x apropos. 検索キーを正規表現で指定でき, 正規表現の 書き方は grep と大体一緒です. XEmacs には特に, この強化版の "Hyper-apropos" というのがあり, これがスゲエ強力で, 良い感じです.

あと, info ね. info は各ノードをズバーっと串ざしに検索できる コマンドInfo-search (デフォルトでは "s" に割り当て) があるんで, これを使わない手は無い.

これらHELP系のコンテンツが表示されてるバッファでは, スクロールやリンクのフォローなど, ひととおりの操作を全部 キー一個で, つまり, コントロールやメタなんかのモディファイアを使わずに できるようにしておくと, 良いかも. あと, enter とかの, 遠くのキーも禁止. また, "j" と "k" を一行スクロールにしておくと man なんかと同じで, わりと良い気分.

script-fu のヘルプは GTK とボタンだから自明っすね. ただ, GIMP 提供の描画関数はこれで良いんですが, 汎用 scheme 関数のマニュアルが, 本体には付属してなくて, GUM の write_scriptfu_reference.html というか, Scheme in One Defun に掲載されています. これを持っていないと plug-ins/script-fu/interp_slib.c とかを 見ないといけなくなってしまうんで, ちょっとアレですね. たとえば, elisp で "concat" は script-fu では "string-append" です. こりゃ知らないと書けねえす!

だいたい解った? じゃあ emacs を引数無しで起動して, あとは書くだけじゃー! scratch バッファへ行け GO!

おすすめなサイト


記事リストへ