簡単Webプログラミング!
Webアプリを作る
Webサーバのrender関数の中身を、図3のコードのように、1ページで使ったRDBプログラムに置き換えれば、簡単なWebアプリになります。
ここでは機能を追加し、http://localhost:3030/?pos=Dのようなパラメータが与えられた場合は、posがDの選手のみリストするようにしました。posパラメータが指定されない場合や、posパラメータの値が「D(デフェンス),F(フォワード),G(ゴールキーパ)」でない場合は全員のリストが表示されます。
では、ここで新たに登場した関数について解説していきます。
(cgi-get-parameter "pos" params)は、パラメータparamsからposパラメータの値を取り出します。posパラメータがなければ#fが戻ります。
(if 条件 式1 式2)は、条件式が真なら式1の値、偽なら式2を値とします。
(and 式1 式2...)は式1、式2...がすべて真の場合、最後の式の値を戻します。ある式が偽の場合、それ以降の式は評価されません。
また、注意点として、本プログラムはエラー処理などを省略しています。実際のシステムに適用する場合は、guard(http://practical-scheme.net/gauche/man/?l=jp&p=guard)などで例外処理を追加してください。
Gauche(Scheme/Lisp)でプログラミング方法
今回は、かなりの量のGauche(Scheme)プログラムを説明しましたが、いざ自分でコードを書こうとするとなかなか手が進まないかもしれません。最後に筆者がGaucheでプログラムを作る際に、注意している点を本プログラムを例に紹介します。プログラム作成の際の参考になれば幸いです。
まず、作成するプログラムの仕様を検討し、いくつかの関数に分解します。今回のWebサーバであれば、ソケットの作成、リクエストの受信、表示コンテンツの作成、コンテンツの表示という関数に分解し、それらを組み合わせたメイン関数(web-server)を作ります。
また、分解した関数からコードがイメージできるほどシンプルになっていない場合は、その関数をさらにいくつかの関数に分解するようにしています。例えば、リクエストの受信関数はリクエストURI取得とURIの解析に分解しました。
次に、その関数を書くのに必要なライブラリ関数を探します。まずは、リファレンスマニュアルを、ざっと一読します。筆者の場合、言語やライブラリのイメージを頭の中に作れると早くプログラミングができるからです。今回のプログラムでは、uri-decompose-hierarchical、cgi-parse-parameters関数を使うことでプログラムが大変シンプルになっています。
また、リファレンスマニュアルを見てもよく理解できない関数は、goshを起動しそこで関数を実際に動かし、試して動作を確認します。
次に、関数をコーディングしていきます。関数は、難しそうな部分、不安がある部分から作っていきます。また、関数は下のレベルのものから作っていきます。関数名は、コードを読む人の理解を助けるものですので、適切な名前を付けます。
関数が書けたら、gosh上で動かし、動作を確認します。もし、最初の関数分割が間違っていることに気がついたら、今まで作ったコードにこだわらず作り直しています。その方が、最終的にわかりやすいコードになるためです。
コードは適切なインデントで書かれてないととても読みにくくなってしまいます。筆者の場合は、インデントはEmacs(Meadow)のインデント機能(TAB)に任せています。基準が一定に保たれるので、どのコードも読みやすくなるでしょう。
Scheme/Lispには独自のスタイル・定石がありますので、それらから学ぶとよいでしょう。また、「Lisp脳」の謎に迫る - Schemeプログラマの発想(http://karetta.jp/book-node/gauche-hacks/023107)は、Scheme的なプログラミングのヒントになります。この文章は書籍「プログラミングGauche」に改良版が掲載されていますまた、Schemeで書かれたプログラムを読むことも理解の助けになるでしょう。
今回のプログラムでは、uri-decompose-hierarchical、cgi-parse-parameters関数を使うことでプログラムが大変シンプルになっています。また、本記事で紹介しているソースコードがダウンロードできますのでぜひお試しください7433.zip(ZIPファイル/1.31 KB)。