LISP礼賛

COBOL批判、FORTRAN贔屓ときたが、今日はLISPをとりあげる。
私が一番好きなプログラミング言語はLISPである。LISPでシステムを開発したこともある。
パソコンで、各種の生活習慣や身体データから余命を計算し、煙草をやめると何年寿命が伸びるかなどの生活改善指導情報を与えるもの。もちろん疑似的なGUIも持っている。

開発言語にLISPを選んだ理由だが、この仕事は、既存の計算手法をプログラミングするのではなく、的確な計算ロジックを開発・テストすることが目的なので、作りながら考えるインクリメンタルなアプローチが必要で、開発している「世界」(=LISP空間)に、機能・データを次々に導入・拡張できるLISP処理系が最も適していると考えたからである。(しかもその拡張すらマクロを使って自動化=プログラムの自動生成すらできてしまう。)
プログラムを書くというより、世界を創るという感じがうれしい。
LISP世界

LISPのエレガントさは後にして、実用上で強力だと思うのは、前述のように世界を拡張できることであり、それを支えている特徴が、関数型言語であり、かつ関数の戻り値がリスト(なんでもあり)であるということ、シンボルにいろんな属性をくっつけておけることなどがある。

LISPを知らない人(いくつかのプログラム言語を知っていても、LISPは知らない人が多いと思う)のために、例えば宛名を印字するプログラム(宛名印刷 住所 名前)を考えよう。このときプログラムは住所、名前は印字すべき文字列として記述されるわけだが、住所録が別に存在していてこれを参照するとしたらプログラムの呼び出しは(宛名印刷 (住所録住所 キー) (住所録名前 キー))というように記述できる。
あるいは、効率の観点から住所と名前をリストで扱いたいとしたら、それを返す関数(住所録参照 キー)を作って、(apply ‘宛名印刷 (住所録参照 キー))とすることもできる。夫婦など宛名を連名にする必要があれば、もちろんプログラム宛名印刷は名前がリストの場合、リスト要素を並べて印字するように改造し、住所録名前関数が、必要なときは連名のリストを返すというようにしてやれば良い。MAP関数群を使えばループ構文など使わずにループと同様の動作をさせることができる。

LISPのエレガントさといえば文法がない(括弧のバランスが唯一のルール)ことだろうが、LISPに惚れるのはやはり再帰プログラミングだと思う。LISPを勉強しはじめたとき、再帰をうまく使う発想がなかなかできなかったが、LISPを通じて再帰プログラミングに慣れるということは、新しい思考パターンが自分に加わる快感を覚える。インタープリター系言語だと再帰呼び出しは普通に行えるが、それを使う人はおそらく稀だと思う。
LISP入門者が最初にやるだろう階乗を計算する関数の再帰的な定義
(defun factorial (n) (if (<= n 1) 1 (* n (factorial (- n 1)))))

LISPの世界をのぞいてみたいという気になった人は次の本がおすすめ(著者は本書の中で「LISPは学ぶに値する言語」と書いている)。
WinstonLISP.jpg
関連記事
スポンサーサイト

コメントの投稿

非公開コメント

Gallery
検索フォーム

⇒記事一覧

プロフィール

六二郎。六二郎。


定年退職
苦しい家計の足しに再就職
=いつクビになってもええねん
 言うたもん勝ちや!のブログ
リンク
最新記事
最新コメント
最新トラックバック
アーカイブ
カテゴリ
タグ

書評 ITガジェット マイナンバー Audio/Visual 

リンク
現在の閲覧者数
聞いたもん