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)。

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30