« プログラミングを始めるには(9) | Main | プログラミングを始めるには(11) »

July 27, 2014

プログラミングを始めるには(10)

elispでプログラムを書くには大きく二通りあると思われる。一つは、大きめのプログラムになる場合で、やりたいことをいくつかの關數に分けて書く方法。もう一つは關數を書かずに直接手續きを書いてしまう方法。

Ws000087

この例では、どちらの書き方をしても大差ないし、この程度の機能でこの先再利用可能なモジュールを見いだせるわけでもないので、普通は後者のような書き方をするのではないかと思われる。しかし、elispを使ってこれからプログラムを書き始めようとする人がこの例のような書き方を最初からするとは思えない。足し算にcalc-evalを使っているのは、elispではオーバーフローを起こすような入力があると計算出來ないからである。

Ws000088

elispでプログラムを書くことに慣れていない人は、下側のような書き方をするのではないかと思われる。この二つの違いは何だろうか。

このプログラムは數字をCOUNT數分入力してその總和を求める。上側のプログラムは文字通りその說明通りに書いただけである。下側のプログラムは、要件を實現するためにいくつか變數を使いながら手續きを考えて(設計して)書いている。どちらも同じ結果になるし、下側のプログラムの方が處理手順が分かりやすいので、こっちの方が良いと考える人の方が多いかもしれない。

しかし、elispのプログラムを書き慣れていくと、どんどん上側の書き方に近づいていくと思われる。それはLisp系のプログラミング言語には要件に忠實に書ける能力があるからだ。要件通りに書けなければ、その要件をどういう手順で處理すれば良いか考えないといけない。そこで勘違いやミスが發生し易くなる。一つ一つの式が單純でプログラムが見やすいというのは、括弧のネストにアレルギーを感じるからではないだろうか。

上側のプログラムでは、まさにCOUNT數分數字を入力して、その數字のリストを作っている。そして入力が終わったら、そのリストにある數字を合計している。プログラムの構造はこちらの方が分かりやすいし、人閒の思考レベルに近い。これを可能にしているのがリストという便利なデータだ。これが入力のタンキングを容易にし、入力處理と合計處理の完全分離を可能としている。つまり、データをどう變化させるかという觀點で見通しの良い構造になっていると言える。よって、まず入力處理を書き、數字のリストが出來ることを確認した後で、合計處理を書くことが出來る。

Ws000089

下側のプログラムについて、入力と合計を分離して書くとこんな感じになるのだろう。そして、要件レベルのデータフローに忠實に考えることに慣れ、リスト操作やマッピング(mapconcat)などの便利な機能を覺えると、どんどん上側のようなプログラムになっていくのである。ちなみに、COUNTにゼロ以下の數字を入力すると上側のプログラムではcalc-evalに空文字列が渡るというバグがあった。しかしcalc-evalは(0 "Expected a number")を返し、ランタイムエラーにはしない仕樣になっている。素晴らしい...ということで少し修正しておいた。

|

« プログラミングを始めるには(9) | Main | プログラミングを始めるには(11) »

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/74224/60050694

Listed below are links to weblogs that reference プログラミングを始めるには(10):

« プログラミングを始めるには(9) | Main | プログラミングを始めるには(11) »