第3回 GaucheでRDBプログラミング

吉田 裕美
有限会社イーワイオフィス

2009/1/16

Lispの一種であるScheme。いくつかある処理系の中でも気軽にスクリプトを書けるGaucheでLispの世界を体験してみよう(編集部)
- PR -

 皆さま、明けましておめでとうございます。本年もよろしくお願いいたします。

 さて、今回はGaucheを使って、より大きなプログラムを書いていきます。Lispプログラミングの例題として、パズルのような難しいアルゴリズムを使ったプログラムもありますが、多くの読者の方はリレーショナルデータベース(RDB)をベースにしたWebアプリケーションを作られていると思います。

 そこで、今回と次回でWebアプリを書いてみたいと思います。今回はRDBプログラミングを中心に学んでいきます。

Gaucheのデータ型とオブジェクトシステム

 今回の主題であるWebプログラミングに入る前に、少しGaucheの基本的な事柄について学んでおきます。

 GaucheはLispであり、関数が主役となりますが、オブジェクト指向言語の特性も持っています。ここではGaucheのオブジェクト指向には深く入りませんが、RDBとのインターフェイスではたくさんのクラスが登場するので簡単に触れておきます。

 Gaucheには数値、文字列、リストやベクターなどたくさんのデータ型があります。そして、それらすべてに対応するクラスがあり、データはそれらクラスのインスタンスです。GaucheのオブジェクトシステムはJavaなどと同様にスロット(slot)と呼ばれるインスタンス変数を持っています。

 Gaucheのデータは、describeという関数でそのデータが所属するクラスやスロットの情報を調べることができます。また、describe関数はデバッグ時などによく使うのでdという名前も付いています。

gosh> (describe 123)
123 is an instance of class <integer>
gosh> (d "abc")
"abc" is an instance of class <string>
gosh> (d car)
#<subr car> is an instance of class <procedure>
slots:
  required  : 1
  optional  : #f
  locked    : #t
  currying  : #f
  info      : "car"
  setter    : #<subr set-car!>

 老婆心ですが、クラス名は<>が付くまたは付けなければいけないルールがあるわけではなく、シンボルに使える任意の文字列が使えます。しかし、習慣としてクラス名は<>でくくっています。

 クラスの定義、使い方については後半でまた説明します。

コレクションとイテレータ

 GaucheはLispですのでリストが主役ですが、ベクター(配列)やハッシュなどのデータの集まりを扱うクラスもあり、それらを統一した操作で扱えるコレクションフレームワークというモジュールが用意されています。

 JavaSEのAbstractCollectionクラスの下に動的な配列(Array)やハッシュ(HashMap)、リスト(LinkedList)クラスがあるのと似ていますね。

 コレクションフレームワークでは、コレクションのすべての要素に対し同じ操作を行う、特定の条件のものを見つけるなどの関数を抽象化したイテレータが定義されています。

 例えば、以下のfor-eachは第2引数で指定されたコレクションの各要素に対し、第1引数で指定した関数(処理)を実行します。この例では、リスト、ベクター、文字列に対してその要素を表示(print)する操作を行っています。ちなみに、#<undef>やtなどのfor-each関数自身の戻り値はあまり意味がありません。

gosh> (use gauche.collection)
#<undef>
gosh> (for-each print '(1 2 3))
1
2
3
#<undef>
gosh> (for-each print #(1 2 3))
1
2
3
t
gosh> (for-each print "abc")
a
b
c
t

 次の例は、コレクションの全要素に対して指定された関数を適用し、その結果をリストで戻すmap関数です。また、ここではlambdaを使って無名関数で処理を定義しています。

gosh> (map (lambda(n) (+ n 1)) '(1 2 3))
(2 3 4)
gosh> (map (lambda(n) (+ n 1)) #(1 2 3))
(2 3 4)
gosh> (map (lambda(c) (integer->char (+ (char->integer c) 1))) "abc")
(#\b #\c #\d)

 mapの戻り値はいつでもリストですが、任意のコレクションを戻したい場合はmap-toを使います。

gosh> (map-to <vector> (lambda(n) (+ n 1)) #(1 2 3))
#(2 3 4)
gosh> (map-to <string> (lambda(c) (integer->char (+ (char->integer c) 1))) "abc")
"bcd"

 
1/5

Index
GaucheでRDBプログラミング
Page1
Gaucheのデータ型とオブジェクトシステム
コレクションとイテレータ
  Page2
GaucheのRDBインターフェイス
SQLite3のインストール
  Page3
GaucheのRDBプログラミング
ORマッパーを作る
Gaucheのクラスの定義、使い方
  Page4
ORマッパーの仕様
ORマッパーのコア部分
  Page5
スロット作成メソッドの定義
<orm>メソッド
DBIインターフェイス

Gaucheでメタプログラミング

 Coding Edgeお勧め記事
いまさらアルゴリズムを学ぶ意味
コーディングに役立つ! アルゴリズムの基本(1)
 コンピュータに「3の倍数と3の付く数字」を判断させるにはどうしたらいいか。発想力を鍛えよう
Zope 3の魅力に迫る
Zope 3とは何ぞや?(1)
 Pythonで書かれたWebアプリケーションフレームワーク「Zope 3」。ほかのソフトウェアとは一体何が違っているのか?
貧弱環境プログラミングのススメ
柴田 淳のコーディング天国
 高性能なIT機器に囲まれた環境でコンピュータの動作原理に触れることは可能だろうか。貧弱なPC上にビットマップの直線をどうやって引く?
Haskellプログラミングの楽しみ方
のんびりHaskell(1)
 関数型言語に分類されるHaskell。C言語などの手続き型言語とまったく異なるプログラミングの世界に踏み出してみよう
ちょっと変わったLisp入門
Gaucheでメタプログラミング(1)
 Lispの一種であるScheme。いくつかある処理系の中でも気軽にスクリプトを書けるGaucheでLispの世界を体験してみよう
  Coding Edgeフォーラムフィード  2.01.00.91

TechTargetジャパン

Coding Edge フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ

@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH