SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

VB6プログラマのためのCurl入門(AD)

VB6プログラマのためのCurl入門
プロシージャとクラスについての比較

第3回 Curl言語のノリをつかもう(その2)

  • このエントリーをはてなブックマークに追加

 VB 6.0では、Sub~End SubおよびFunction~End Functionという構文でプロシージャを作り、クラスモジュールでクラスを作ります。Curlでは、これからがどのように表現されるのでしょう。できるだけシンプルなサンプルプログラムを示しますので、Curl言語のノリをつかんでください。

  • このエントリーをはてなブックマークに追加

VB 6.0と比較しながらCurl言語のノリをつかもう

 前回に引き続いて、Curl言語の基本的な言語構文を説明します。今回取り上げるのは、プロシージャとクラスの作り方です。VB 6.0では、Sub~End SubおよびFunction~End Functionという構文でプロシージャを作り、クラスモジュールでクラスを作ります。Curlでは、これからがどのように表現されるのでしょう。できるだけシンプルなサンプルプログラムを示しますので、Curl言語のノリをつかんでください。

これまでの記事

プロシージャの作り方

 はじめに、プロシージャを作ってみましょう。Curl IDEを起動したら、「ファイル」メニューから「新規プロジェクト」を選択し、表示されるウインドウで「アプレットプロジェクト」を選択します。「マニフェスト名」に「ProcSample」と入力し、プロジェクトを保存する「ディレクトリ」には前回と同様に「C:¥CurlSamples¥ProcSample」と入力します。最後に[OK]ボタンをクリックしてください。

 Curl IDEの左上にツリー表示された「start.curl」をダブルクリックします。これによって、ソースコードを編集するエディタのウインドウが開きます。エディタの中には自動生成された数行のコード(Curlのプログラムであることを示す宣言文)があります。これらのコードの後に続けてCurl言語でプログラムを記述します。これから示すサンプルプログラムのコードでは、宣言文の後に記述するものだけを示します(ここまでの手順は、後で別のサンプルを作るときも同様です。サンプルごとに新規プロジェクトを作成し、適当なマニュフェスト名を付け、マニュフェスト名と同名のディレクトリに保存してください)。

 VB 6.0では、値を返さないプロシージャをSub~End Subという構文で作り、値を返すプロシージャをFunction~End Functionという構文で作ります。Curlでは、値を返す、返さないにかかわらず {define-proc・・・} という構文で作ります。値を返さない場合は、戻り値のデータ型としてvoid(「無し」を意味する)を指定し、値を返す場合はintやdoubleなどのデータ型を指定します。

 サンプルを示しましょう。リスト1は、2つの引数の加算結果を返すadd-numプロシージャです。プロシージャ名が複数の単語(ここではaddとnum)を組み合わせたものとなっている場合は、ハイフンで区切るのがCurlのノリです。

リスト1 2つの引数の加算結果を返すプロシージャ
{define-proc {add-num a:int, b:int}:int
    {return a + b}
}

 {define-proc・・・} の中に { } で囲んで「プロシージャ名」と「引数名:データ型」を記述します。引数が複数の場合は、カンマで区切ります。ここでは、int型のaおよびbの2つの引数があります。 } の後にある:intは、プロシージャの戻り値のデータ型がint型であることを示しています。プロシージャの処理は、やはり { } で囲みます。{return a + b} という処理は、引数aとbの加算結果をプロシージャの戻り値として返すことを意味しています。このように、{ } を多用するのもCurlのノリです。

プロシージャの呼び出し方

 add-numプロシージャを呼び出して、戻り値を表示してみましょう。リスト2は、引数に123と456を与えてadd-numプロシージャを呼び出し、その戻り値を変数ansに格納し、最後に変数ansの値を表示するコードです。

 {add-num 123, 456} という構文に注目してください。プロシージャ名の後に引数をカンマで区切って指定するのはVB 6.0の構文と同様ですが、プロシージャの呼び出し全体を { } で囲んでいるのがCurlの構文のノリです。Curlという名前は、curly bracket(中カッコ)に由来していると言われます。Curlの言語構文には、プログラムの構成要素を { } で囲んでパーツ化するようなノリがあります。

リスト2 プロシージャを呼び出す
|| 2つの引数の加算結果を返すプロシージャ
{define-proc {add-num a:int, b:int}:int
    {return a + b}
}

|| プロシージャを呼び出し、戻り値を表示する
{let ans:int}
{set ans = {add-num 123, 456}}
加算結果は、{value ans}です!

 リスト2では、コメント(ソースコードの中に記述する説明文)もあります。Curlでは、縦棒2つ(||)に続けてコメントを記述します。それでは、「実行」メニューから「プロジェクトを実行」を選択して、プロジェクトを実行してみましょう。Webブラウザが起動して、その中に「加算結果は、579です!」と表示されるはずです(図1)。

図1 リスト2の実行結果
図1 リスト2の実行結果

複数の戻り値を返すこともできる

 Curlのプロシージャには、VB 6.0にできない便利な機能があります。VB 6.0のプロシージャが返せる戻り値が1つだけなのに対し、Curlのプロシージャは複数の戻り値を返すことができるのです。サンプルを示しましょう。

 リスト3の前半部は、2つの引数の加算結果と減算結果を返すadd-sub-numプロシージャです。returnの後にカンマで区切って2つの戻り値を指定します。戻り値のデータ型は、:(int, int) のようにカッコ(ここは小カッコですので注意してください)で囲んでカンマで区切って指定します。

リスト3 2つの引数の加算結果と減算結果を返すプロシージャ
|| 2つの引数の加算結果を返すプロシージャ
{define-proc {add-sub-num a:int, b:int}:(int, int)
    {return a + b, a - b}
}

|| プロシージャを呼び出し、戻り値を表示する
{let ans1:int, ans2:int}
{set (ans1, ans2) = {add-sub-num 123, 456}}
加算結果は、{value ans1}です!
減算結果は、{value ans2}です!

 リスト3の後半部は、add-sub-numプロシージャの呼び出しです。2つの戻り値を代入する2つの変数を (ans1, ans2) のようにカッコ(ここも小カッコですので注意してください)で囲んでまとめていることに注目してください。add-sub-numプロシージャのreturnで前側にあった戻り値(加算結果)と後ろ側にあった戻り値(減算結果)は、それぞれ ( ) で囲まれた前側の変数ans1と後ろ側の変数ans2に代入されます。プログラムの実行結果を図2に示します。

図2 リスト3の実行結果
図2 リスト3の実行結果

クラスの作り方

 Curlは、オブジェクト指向プログラミングを実践できる言語です。変数とプロシージャ(属性と振る舞い)をカプセル化したクラスを作ることができます。VB 6.0でも、クラスモジュールとしてクラスを作ることができます。例えば、リスト4は、円を表すMyCircleクラスをVB 6.0で作成したものです。MyCircleクラスのメンバには、円の座標を表すx、y、および半径を表すrという変数と、円の面積を返すGetAreaというプロシージャがあります。

リスト4 円を表すMyCircleクラス(VB 6.0)
Public x As Double  ' 中心位置のx座標
Public y As Double  ' 中心位置のy座標
Public r As Double  ' 半径

' 面積を返すプロシージャ
Public Function GetArea() As Double
    GetArea = Me.r * Me.r * 3.14
End Function

 これと同様のクラスをCurlで作るとリスト5のようになります。

リスト5 円を表すMyCircleクラス(Curl)
{define-class public MyCircle
  field public x:double    || 中心位置のx座標
  field public y:double    || 中心位置のy座標
  field public r:double    || 半径

  || 面積を返すプロシージャ
  {method public {get-area}:double
    {return self.r * self.r * 3.14}
  }

  || コンストラクタ
  {constructor {default x:double, y:double, r:double}
    set self.x = x
    set self.y = y
    set self.r = r
  }
}

 VB 6.0では、クラスモジュールの中にコードを記述することでクラスを作成しますが、Curlでは任意のソースコードの中でクラスを作成できます。{define-class public MyClircle・・・} の中に変数とプロシージャを記述するのです。クラスのメンバである変数を「フィールド」、プロシージャを「メソッド」と呼びます。publicの意味は、VB 6.0と同様です。selfは、VB 6.0のMeに相当します。コンストラクタという特殊なメソッドの役割は、すぐ後で説明します。

オブジェクトを生成する方法

 クラスはオブジェクトを生成して使います。これはVB 6.0とCurlで同様です。

 リスト6は、MyCircleクラスのオブジェクトcを生成し、フィールドx、y、rに適当な値を代入してから、GetAreaメソッドを呼び出すVB 6.0のコードです。c.x、c.y、c.rでフィールドを参照し、c.GetAreaでメソッドを呼び出します。この「オブジェクト名.メンバ名」という構文は、後で紹介するCurlのコードでも同様です。このドットを「~の」と読むとわかりやすいでしょう。c.xなら「オブジェクトcのフィールドx」、c.GetAreaなら「オブジェクトcのGetAreaメソッド」です。

リスト6 オブジェクトを生成して使う(VB 6.0)
' オブジェクトを生成する
Dim c As MyCircle
Set c = New MyCircle

' フィールドに適当な値を代入する
c.x = 100
c.y = 200
c.r = 10

' メソッドを呼び出す
MsgBox c.GetArea()

 VB 6.0と同様のコードをCurlで記述すると、リスト7のようになります(実行結果を図3に示します)。このコードは、MyCircleクラスと同じソースコードの中に記述できます。

リスト6 オブジェクトを生成して使う(Curl)
|| オブジェクトを作成する
{let c:#MyCircle}
{set c = {MyCircle 100, 200, 10}}

|| メソッドを呼び出す
円の面積は、{value {c.get-area}}です!
図3 リスト6の実行結果
図3 リスト6の実行結果

 注目してほしいのは、{set c = {MyCircle 100, 200, 10}} の部分です。クラス名MyCircleに続けて指定されている3つの数値は、それぞれフィールドx、y、rに代入されます。これを実現しているのが、コンストラクタという特殊なメソッドです。VB 6.0のコードに比べてCurlのコードでは、コンストラクタがあるお陰でオブジェクトのフィールドへの値の代入が容易に実現できます。

 コンストラクタ以外にも、Curlには本格的なオブジェクト指向プログラミングを実現するための便利な構文が数多く用意されています。ただし、オブジェクト指向プログラミングを強要しないところが、Curlのよいところだと言えるでしょう。

おわりに

 前回と今回の2回に渡って、Curlの言語構文の概要を説明してきましたが、いかがだったでしょう。「はじめてソースコードを見たときはとても難解に思えたが、ノリさえつかめれば使いこなせそうだ」と感じていただけたでしょう。

 さて、次回はCurlを使って、ちょっと凝ったユーザーインターフェースを作る方法を紹介します。Curlのセールスポイントは、なんたって「インターネット時代のリッチクライアントアプリケーション開発ツール」なのですから、凝ったユーザーインターフェースを容易に作れる仕掛けがたくさん用意されています。

修正履歴

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3323 2008/12/02 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング