多機能な列挙型

abdev 多機能な列挙型 はコメントを受け付けていません

Enumステートメントにて列挙型が定義できるようになっていますが、現状の仕様ではただ単に定数を羅列するだけの機能にとどまっています。AB5ではこの軟弱な列挙型機能を、タイプセーフであり、数値・文字列への相互変換が容易な機能へ拡張したいと思います。

まず、Enumステートメントどうのこうのという前に、すべての列挙型が継承する基底クラスを設計したいと思います。

Class EnumBase
    m_Value As Long
    m_Name As String
Public
    Sub EnumBase(value As Long, name As String)
        m_Value=value
        m_Name=name
    End Sub

    Function ToString() As String
        Return m_Name
    End Function

    Function Operator() As Long
        Return m_Value
    End Function
End Class

このEnumBaseはすべての列挙型が継承するクラスであり、数値と名前をプライベートメンバとして保有しています。ToStringメソッドで列挙子の名前を取得できるようになっています。

で、肝心のEnumステートメントですが、例えば、下記のようなコードがあったときにEnumBaseを継承し、列挙型クラスを自動生成するような機構をコンパイラに持たせます。

Enum test
    a
    b
End Enum

上記のようなソースコードは下記のクラスと等価の意味を持つことになります。

Class test
    Inherits EnumBase
Public
    Sub test()
        EnumBase(1,"a")
    End Sub
    Sub test(value As Long, name As String)
        EnumBase(value,name)
    End Sub

    Static a As test(1,"a")
    Static b As test(2,"b")

    Sub Operator= (value As Long)
        Select Case value
            Case 1
                This=a
            Case 2
                This=b
            Case Else
                'error
        End Select
    End Sub

    Sub Operator= (value As String)
        Select Case value
            Case "a"
                This=a
            Case "b"
                This=b
            Case Else
                'error
        End Select
    End Sub
End Class

※静的メンバ・メソッドを定義するStatic修飾子は未実装ですのであしからず。

このような実装を行うと、列挙子は単なる整数の定数値ではなく、列記として一つのオブジェクトという扱いになります。列挙型オブジェクトをファイルから読み込んだり書き込んだりする場合は、演算子オーバーロード・ToStringメソッドにより、簡単に整数値やString型に変換できるようになります。

例えば、上記のtest列挙型オブジェクトには下記のような代入方法・参照方法があります。

Dim e As test
e=test.a
e="a"
e=1

Dim i As Long
i=e

Dim s As String
s=e.ToString()

ちなみに、Const定義の右辺値に列挙子を指定したいこともあるかと思うので、この機能は別途、コンパイラが提供することになります。

さて、この案、うまく行くのでしょうか・・・。

1. Static修飾子を有効にして静的メソッド・メンバを追加できるようにする
2. Enumステートメントをクラス定義に変換するモジュールを作成する
3. 定数として扱う列挙子データをコンパイラで管理する

これらの問題をクリアできれば、高機能な列挙型の未来は明るいかも☆あと、静的メンバオブジェクトはグローバル変数同様、利用の有無に関わらず、実行ファイルに含まれてしまうので、基本ライブラリに含まれる列挙型の関係で実行ファイルの最小サイズが肥大化する可能性があります。この問題は別途検討する必要がありそうです。

どれも納得してしまう

after どれも納得してしまう はコメントを受け付けていません

Rubyの記事はいつもオモシロそうなことが書いてあるんで読んでいるのですが、こういう冷めた視点で考えるのも悪くないです。

Rubyの生産性の高さはどこまで本当か?

その反面、後日下記のような形でまとめられています。単一言語の話題から「言語」そのものの存在に関する考察に移るあたりは一般的な感じがします。が、fromdusktildawn氏は経験豊富であることが伺えます。

現代という時代は、どのようなプログラミングを求めているのか?

将来、私もこういったレベルで物事を見れるようになるのでしょうか…。視点の対象は大きいものから小さいもの、様々ですが、まだまだ自分の世界が狭く感じられます。結局下記の記事にも納得させられてしまい、神秘の世界を感じたのでした。

とてつもない奇跡

心配だった視力

after 4 Comments »

最近、静岡のショッピングビルの中に入っているメガネ屋のコ達と友達になったので、遊びがてら視力をはかってもらうことにしました。

最後に視力をはかったのは今のメガネを買った三年前のこと。そのときよりも見え方がぼんやりしてきていたので、とっても悪くなってしまったんではないかと、過剰な心配をしていたわけなんです。

結果は、OKライン。今のメガネ(三年前につくったやつ)の度が一番あっているということでした。っつーことは、目は大して悪くなっていないということになります。ホッ

  • 裸眼で0.2
  • メガネをかけて1.5

皆さんの視力はどうですか?目はたったの2つしかありませんし、一度失った視力を回復するのは大変なことです。こんな業種なだけに、大切にしたいものですね。

スレッドクラス

abdev スレッドクラス はコメントを受け付けていません

Windowsのマルチスレッドと言えば、CreateThread、_beginthreadなどのAPIを思い浮かべる方が多いかと思います。

AB5でのクラスライブラリでは勿論ながらスレッド関連のクラスも提供する予定ですが、これはただ単にスレッド関連のAPIをラップするだけの働きではなく、スレッド間のメモリ管理も請け負う高機能なクラスにまとめあげていきます。

AB5でGCを扱う場合、更には対象アプリがマルチスレッドを利用する場合はこの新しいスレッドクラスは必需な存在になります。

ということで、スレッドクラスの必要性をおさえた上で、具体的な実装方法を検討していきたいと思います。

私の中で選択肢として出ているのは下記の2通りの方法。

  • Threadクラスをインスタンス化する方法(C#、VB.NETなどはコレ)
  • Threadクラスの派生をインスタンス化する方法(Javaなどはコレ)

D言語などはどちらの特性も持ち合わせるハイブリット構造になっているようです。

双方がどのように違うかと言うと、新しいスレッドを生成するときに、メソッドそのものを指定するのか、またはクラスを指定してオーバーロードされたRunメソッドを実行するのかの違いくらいですかね。前者の方法は、デリゲート機能が付いている言語で効力が発揮できそうです。

資料をあさっていたら、MFCのCWinThreadなどというちょっと懐かしいものを見つけてしまいました。こちらは完全なるAPIのラップクラスですね。

プロパティの実装

abdev 35 Comments »

今夜はライブラリ開発者の皆様に待っていただいている機能の一つ、プロパティの実装を行っています。

 VB.NETを見習って、Propertyステートメントを・・・となりそうですが、プロパティに関してはD言語の仕様を見習う形での実装を行いたいと考えています。

ABでプロパティを記述したときのソースコードのサンプルイメージを下記に示します。

'-------------------------------------------------------
' D言語の構文を参考にしたプロパティ構文の実装
' Note:  呼び出し解釈に柔軟性を持たせる
'-------------------------------------------------------

Class CTest
    m_label_str As String
    m_label_i As Long

    m_table[100] As Long
Public

    Function label() As String    'label.Getアクセサ
        Return m_label_str
    End Function
    Sub label(Value As String)    'label.Setアクセサ
        m_label_str=Value
    End Sub

    Function label() As Long    'label.Getアクセサ
        Return m_label_i
    End Function
    Sub label(Value As Long)    'label.Setアクセサ
        m_label_i=Value
    End Sub

    '配列要素を持たせたプロパティ
    Function table(e As Long) As Long    'label.Getアクセサ
        Return m_table[e]
    End Function
    Sub table(e As Long, Value As Long)    'label.Setアクセサ
        m_table[e]=Value
    End Sub
End Class

 ん!?これじゃ、普通のメソッドじゃん。プロパティじゃないじゃん。

 そう思われる方もいらっしゃるかと思いますが、実はABが実装しようとしているプロパティというのは、呼び出し側(代入・参照側)の解釈を一ひねりし、宣言側は従来のメソッド定義で事足りるようになっているのです。

具体的には代入先、参照先に期待するメンバが存在しなかったときに、コンパイラが下記のような解釈をするようにします。

Getアクセサ:
“a=obj.label” → “a=obj.label()”

Setアクセサ:
“obj.label=b” → “obj.label(b)”

さてさて、週末には実装が完了しますので、早速β版のパッケージングに入っていこうと思います。

千葉へ小旅行

after 千葉へ小旅行 はコメントを受け付けていません

二年前、元バイト先である服屋に私を雇ってくれた店長のウチへ遊びに行ってきました。今はその店長は千葉の店舗を統括しています。特に用事があったわけではないのですが、私がこういう(会社を辞めた)状況ですので、差し当たりの進路などの報告を兼ねて行ったっちゅうワケなんです。

今回の連れはしょっちゅう酒を飲む間柄でもある、MICです。

静岡~千葉までは200KM弱あります。高速と下道を使い分けてドライブしたのですが、まぁ長かったですよ。千葉に着いて、近くの飲み屋にでもいくのかと思ったら・・・

私「お久しぶりです~。」

店長「おぅ!元気にしてるか!っでさー、ヤマ、今から成田行くからさ、よろしくな」

私「成田ですか?確かに千葉にありますけど、(といってナビを見て…)って40キロも離れてるじゃないですか。もう夕方ですよ。夜になっちゃいますよ」

店長「大丈夫だって。今日は勿論ウチに泊まんだろ!?成田空港の近くにハードロックカフェがオープンしたからさ、そこに行こうよ」

MIC「ハハ、ハードロックカフェですか!?!?行きます行きます!!!」
※実はMICと店長はかなりのロック好き。60/70/80年代のロックに興味深々なのです

私「(しょうがないな)じゃぁそうしますか。」

ここから、私とMICと店長とその嫁さんの4人行動になります。

p1030020.JPG   p1030019.JPG

この写真はハードロックカフェの店内の様子です。スクリーンには常に何かしらのロックが流れています。壁一面にはギターやら衣装やらがビッシリ。ファンにはたまらないような雰囲気をかもしだしています。

この店で皆さんはお酒を頼みます。私は運転手なので酒はなしです。コーラです。そして、自分に言い聞かせます。これは夕飯なのだ、と。

MIC「(私をさして)アレ?デーちゃんは酒飲まないのね。あ、そっか運転あるのか」

店長「そういうことゆーなよ。ヤマはウチ帰ってから好きなだけ飲ませてやるよ」

私「いいですよ。これ、夕食ですから。このでかいハンバーガー頼みますから。( ;; ̄3 ̄) 」

成田について、しょっぱなからこのテンションです。まぁ、家に帰ってからキチンとお酒をもらいましたよ。
結局この日は日帰りはムリっぽいということで泊まることにしました。

そして二日目。店長は仕事だったんで私とMICと嫁さんがヒマになったんです。まぁ、私らは帰るだけだったのですが、せっかく千葉まで来たということで、県立美術館(渋い選択(^~^;)ゞ)と幕張ベイタウンを散策してみました。

久しぶりに訪れる美術館、自分の世界に入ったもの勝ちということで、じっくりと静かな時間を楽しんできました。

そして幕張ベイタウン、皆さんはご存知ですか?幕張メッセの近くにあるのですが、完璧なる区画整理がなされ、電線などのゴチャゴチャしたのがすべて地下に埋められているのです。そう、これぞ外国風、近未来都市(な~んか田舎くさい言い方…)。

p1030021.JPG

そして、路駐OKな開けた道路が印象的なこの街。興味本位ではありますが、一度くらい住んでみたいです。
結局昼食に幕張ベイタウンにあるカレー屋さんに行って、帰ることにしました。

時間に縛られないため、帰り道はゆっくりペース。湘南の海を見ながら帰ろうということで、R1、R15を帰路に選びました。

で、アクシデントが発生したのが箱根峠です。ガソリンがそこをつき始めたころ、箱根峠へ直進するか、ガソリンを入れてから三島・沼津を目指すか、選択を迫られたのです。

MIC「これ、ガソリン入れてったほうがいいかな・・・」

私「うーん、微妙なラインだけど、大丈夫っしょ。チャレンジですよ、チャレンジ!」

MIC「デーちゃんがそういうなら大丈夫か。んじゃ、このまま行こうか」

チャレンジ精神を大切に!などと、どうしようもないことを口走りながら峠へ向かったのですが、登り坂がきいたのか、ナビの隣に表示されている航続可能距離はみるみるうちに減っていきます。ついに一ケタ代になってしまったときは、まだ峠にも満たない場所。

自動車についている燃料メーターはカラッケツになっても50kmくらいは走るようになっているといいますが、実際に航続可能距離が数値ではなく、”—” という表示になったときは焦りました。チョロチョロ走っていたらいつとまってしまうのかわかりません。

峠のど真ん中でガソリンが無くなるというスリリングな体験をしてしまいましたが、なんとか麓までたどり着き、無事にガソリンを入れることができました。

こんな感じで、千葉へ行った二日間は久しぶりに旅気分を味わうことが出来たというわけです。

Ajaxで動的トップページを

abdev 21 Comments »

ブログ引越ししたので、ab.comのトップページのRSS配信モジュールを書き換えなければなりません。現状では、ただ単にJavaScriptのdocument.write文を発行するCGIを呼んでいるだけですので、AjaxでサクッとRSSを呼んでくるようにサイトモジュールの改良を行おうと考えています。

どっかにコピペするだけでRSSが読めてしまうようなAjaxコードが落ちていないかな~と思ったのですが、なかなかそのような有難いコードにはたどり着けませんでした。暇な時間を見つけながらコツコツ書いてみますか・・・

それにしても、CGIベタバリの場合はRSS配信サイトからのレスポンスが遅いとサイト全体に響きます。このような不具合に近い部分も改良すべきですね。

AB開発日記、こちらで再開します

abdev 1 Comment »

はい、どうも。「はてな」から「dev.activebasic.com」に移動してきました。心機一転、新しい気持ちでブログ更新をしていきたいと思います。

ちなみに、このブログが乗っかっているdev.activebasic.comドメインですが、本家のコンテンツとは少し異なり、下記のような感じで住み分けを進めていきたいと思っています。今回の引越しもその一環ですな。

  • www.activebasic.com … ABの一般向け公開サイト
  • dev.activebasic.com … 開発者向けサイト

っにしても、このブログシステム、WordPressで動いているのですが、パッと触った感じは良いですね。MTと迷いましたが、ライセンスの問題がウザそうだったのでこちらに決めました。自前でブログシステムをインストールされる方に関しては、WordPress人口が増えそうな予感がしますね。

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS ログイン