(右)括弧との戦い

LispのS式は括弧のお化けと言われるくらいであり,プログラミングにおいてもデータにおいても右かっこの数が大抵は少なすぎて「インタープリタにいじめられた」と感じることが多い.Lispによるプログラミングを止めたくなるときである.
右かっこの問題と戦う方法はいくつかある.基本的には予防と対処に分かれる.
1. 予防
1.1 右かっこの問題が起きないようにデータやプログラムを単純化する.
1.2 自分でインデンテーションを行い,深さの意思表示をし,小刻みにそれを確認する.
1.3 少しずつプログラムを書いて言って,とにかくエラーの起きる場所が限定できるように心掛ける.
1.4 自分の括弧の使い方のスタイルを作る.
1.5 あとは慣れだろう.大体こういうところには,4つくらい右かっこが並ぶものだ,といった感覚.慣れればそう怖くはないし,時間を取られることもない.他のプログラミング言語においてセミコロン,コンマ,ピリオドなどの誤りによって引き起こされる問題に比べて性質がいいともいえる.
2. 対処
2.1 取りあえずは関数定義の終わりに右かっこを多数書いてみてLispインタープリタにファイルを読み込めるようにしよう.どこに右かっこを供給したかを押さえておけば,問題の生じた個所(大体,右かっこの数が沢山並んでいるところが怪しい)を局在化できる.時々不足しているのは,”(文字列のダブルクォート)の相棒である時もある.ダブルクォートを使ったという意識があればプログラム末に取りあえず1個ダブルクォートを共有して様子を見るというのでもよい.
2.2 Lispインタープリタのpretty printを使うとS式の深さをインデンテーションで示してくれるから,それが自分の意図と合ったものかどうか確認してみる.
3. 例題
・次のファイル中のプログラムには右かっこが抜けている.→右かっこが不足したプログラム例
・従って,このファイルからプログラムを読み込もうとするとこんな反応が出る→右かっこ不足の場合の典型的なエラー
この「Unexpected end of #<input stream…」が出るのはたいてい右かっこ不足.どこがまずいかわかるかな?
・わからなくなったら,次の例のようにプログラムの後ろにたくさん右かっこを供給する. → 取りあえずの改訂版
これでLispインタープリタから読み込み可能になる.→ こんな感じ
・でも自分では正しいと思い,インデンテーションしたはずのプログラムの右かっこが不足しているというのだから,プログラムは思ったように読み込まれていないはず.
・そこで(function プログラム名) ― いまの場合は,(function compute-with-ffnet) ― を実行して,自分が考えている定義と比較する.→こんな感じになる
・ここで自分で書いたプログラムと各行のでこぼこを比較すると,すぐに違いが分かる.該当箇所に括弧を挿入すると→こうなる.
・ここで再度読み込んで,定義を調べると→こうなる
4. 後記
そういえば,昔GUI以前のころは,Lispといえばemacsと組み合わせるのが典型的な使用法であった.(確か)emacsは右かっこのところにカーソルをもっていくと,対応する左かっこがブリンクしてくれたので,括弧の対応問題は現実的には生じなかった.また,デバッギングでプログラムをロードし,データをセットし,実行するという行為を何回も繰り返し行い,Lispのプログラムの出力する,時として膨大なデータを記録したり,作業に利用したりするためにウィンドウをソースプログラム用と実行制御用に2分割して,分割されたウィンドウをあっちに行ったりこっちに行ったりしながらプログラミングを進めていくというスタイルでの開発プロセスが支援されていた.
今回,Meadowをインストールしてもらったのは,Meadowがemacsの流れをくんでいるので,上に述べたフィーチャーも伝承され,もっとよくなっているに違いないと思ったからだ.しかし,emacs系の欠点である,controlとescapeを使った簡略なコマンド系を覚える必要があること,使いこなせるまでは特有の「癖」に結構いじめられる(例えば,BackSpaceは「後退して直前の1文字消す」というコマンドには対応していない)ことなど,ここで前提としている超カジュアルプログラミング(要は,あまりツールに深入りせず,たまにプログラミングして,教科書に載っていたり,自分が思いついた,時として「紙の上では負えないくらい複雑な」ロジックの正当性や効用を調べたい,といった目標を学習やプログラミング時間も含めて短時間で満足したいといった,動機によるプログラミング)には必ずしも適さないこともある.そして何よりも,Meadowには精通していないこともあり,上記に書いたこと,そして今回のプログラミング演習は,gnu common lispと,コマンドコンソールと,windowsの最も平易なテキストエディタ(メモ帳)だけで実施できることを前提とした.