オペレータのオーバーロードは予定通り
オペレータオーバーロード、ロジックはそのままで、64コンパイラへの対応を行いました。ロジックがそのままなら、コードをポンづけで対応したいところなのですが、演算過程のレジスタ割付とかが違っているので、ちょっと手直しをしなければなりません。量はそれほどでもないのですが、いかんせんデバッグに時間がかかる・・・(そろそろデバッグの新手法でも編み出さないとヤバめになってきました)。
さて、ここらが一段落したところで、一般公開向けのAB5βを考えて参りたいと思います。
やはり、AB5が重要視したいところは、提示されたライブラリと言語仕様を活用して、いかにスピーディーに安全なコーディングを行えるかといったところです。今回ばかりは、ただ単にAPIセットをザザァ〜っと提示するだけではなく、実用的な使えるライブラリを提供したいきたいところ。で、業務面でも生かしつつ、実績が上を挙げられれば文句はありません。
しかし、まだまだその先があります。ここからは非現実的なものを含む、夢物語を…
- 意味解析&コード生成ロジックはそのままに、C/C++の構文規約に近づけたバージョンの開発
- テンプレートを導入したジェネリックプログラミングのサポート
- IDEのプラグイン機能の導入(特に、コントロール類を外部から簡単に追加したい!)
三番目の案件なんかは、できればAB5でも導入していきたいくらいの勢いです。IDEすべてをというわけにはいきませんが、AB5程度の言語セットであれば、IDE用プラグインをCOMコンポーネントで実装させることができそうです。
さてさて、明日は地元の花火大会(今年初!)。なんとか、雨は大丈夫なよう。降るなよ〜(><)
CStringクラス
オペレータのオーバーロードがほとんど出来上がったので、試しにCStringのデモコードを書いてみました。
Class CString
Public
m_lpszBuffer As LPSTR
m_length As LongSub CString()
m_lpszBuffer=calloc(1)
m_length=0
End Sub
Sub ~CString()
free(m_lpszBuffer)
m_lpszBuffer=0
End SubFunction Operator() As LPSTR
Return m_lpszBuffer
End FunctionSub Operator= (ByRef objString As CString)
m_length=objString.m_lengthm_lpszBuffer=realloc(m_lpszBuffer,m_length+1)
memcpy(m_lpszBuffer,objString.m_lpszBuffer,m_length)
m_lpszBuffer[m_length]=0
End SubSub Operator= (lpszText As LPSTR)
m_lpszBuffer=realloc(m_lpszBuffer,lstrlen(lpszText)+1)
lstrcpy(m_lpszBuffer,lpszText)
m_length=lstrlen(lpszText)
End SubFunction Operator+ (lpszText As LPSTR) As CString
Dim tempString As CString
tempString=ThistempString.m_lpszBuffer=realloc(
tempString.m_lpszBuffer,
tempString.m_length+lstrlen(lpszText)+1)
lstrcpy(
tempString.m_lpszBuffer+tempString.m_length,
lpszText)
tempString.m_length+=lstrlen(lpszText)Return tempString
End FunctionFunction Operator+ (ByRef objString As CString) As CString
Dim tempString As CString
tempString=ThistempString.m_lpszBuffer=realloc(
tempString.m_lpszBuffer,
tempString.m_length+objString.m_length+1)
memcpy(
tempString.m_lpszBuffer+tempString.m_length,
objString.m_lpszBuffer,objString.m_length)
tempString.m_length+=objString.m_lengthtempString.m_lpszBuffer[tempString.m_length]=0
Return tempString
End Function
End Class
パラメータの型を識別しながらオーバーロードしていくのは良いのですが、キャストされることを見越して、戻り値でオーバーロードの解決を行うためには、コンパイラのほうをもう一捻りしなくてはなりません。
CStringは仮の名前なので、クラスが完成したらString型へ変更しようと思います。で、コンパイラにこびりついている従来のString型をすべて解除する方向で行きたいと思います。スマートに行ってくれることを祈ります・・・・・