ないもの?乱入
単に使いどころの無いDelphi for .NETを使えそうなチャンスを取られて悔しかっただけです。
http://d.hatena.ne.jp/ladybug/20051018#p1
with MSSyst.Console; with MSSyst.String; with MSSyst.Resources.ResourceManager; with MSSyst.Reflection.MethodBase; -- with MSSyst.Reflection.Assembly; -- with MSSyst.Reflection.MethodInfo; with MSSyst.Type_k; procedure Test is use MSSyst; -- ConsoleをladybugさんのDelphi for .NET, C#と同様に記述するため use type MSSyst.String.Ref; -- こ れが無いと自動変換してくれない type N is (A, B); -- Enumどころかint8になっちゃったよ type Nx is array (N) of Boolean; -- ↑なのでint8[], なおpragma Pack付けると内部エラー procedure X (flags : Nx; prefix : String) is function GetName(n : Test.N) return string is use MSSyst.Resources; NAMEofA : constant String := "NAMEofA"; NAMEofB : constant String := "NAMEofB"; -- ↓ソース上型になってない物へのtypeofをどう書けばいいのか… rm : ResourceManager.Ref := ResourceManager.new_ResourceManager( resourceSource => MSSyst.Reflection.MethodBase.GetCurrentMethod.get_DeclaringType); -- resourceSource => MSSyst.Reflection.Assembly.GetEntryAssembly.get_EntryPoint.get_DeclaringType); begin case n is when A => return prefix & (+rm.GetString(NAMEofA)); -- .NET -> Ada は"+"を使う when B => return prefix & (+rm.GetString(NAMEofB)); -- when others => -- 全列挙済みなのでコンパイルエラー end case; end GetName; begin for I in flags'Range loop if flags (I) then Console.WriteLine(GetName(i)); -- Ada -> .NETは自動 end if; end loop; end X; begin X (flags => (A | B => True), prefix => "*"); end Test;
はっきり言って.NETのランタイムは、Java風クラスモデルを持って無い言語にはきつすぎます。.NETのために作られたC#やVB.NETだけ見てミックスランゲージを喜んでるのはMSの思惑にはめられてそうというか、Delphiのそれは比較的Javaっぽく、managed C++はC++Builderでの拡張っぽくて許容範囲とも思えてしまいますが、プロトタイプベースすら怪しくなってるJScript.NETや…あれDDotNetのページが落ちてる…まあいいか。
A#ではコンパイラが頑張ってpragma等を除いては言語仕様は侵食されてない(っぽい)のですが、それはつまり翻訳結果がソースから読めない、触れられないということで、単にライブラリを使うだけでも、typeofの代用品を探して右往左往することになります。
まあほぼ全ての言語がサポートしているであろう機能セットなんて、OSのAPIの形式であるところの「C言語」で落ち着いてしまっているのは間違い無いところですので、こんなこと言ってたら「オブジェクト指向っぽくてC#にしかない機能もふんだんに使ったライブラリを持つ」共通言語ランタイムなんて成り立たないのは事実ですが…。
さてこのためだけにA#入れてしまったのですが、前に試した時とは違ってインストーラができたお蔭で使えるようになるまで10分もかからず。衝突も無し。楽になったものです。このコード書くのには一時間ぐらいかかってますが。
なお.NET式のリソースの作り方がわからなかったというか調べる気すら無いため実行するとこうなります。
...>test ハンドルされていない例外 : System.Resources.MissingManifestResourceException: 指 定されたカルチャ (またはニュートラル カルチャ) に必要なリソースがアセンブリに見 つかりません。"test.resources" が、アセンブリ "test" に正しく埋め込まれているか 、またはリンクされているかを確認してください。 baseName: test locationInfo: test resource file name: test.resources assembly : test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null at mgnat.adalib.GNAT_libc.reraise_occurrence_no_defer(Object e) at test.x(Boolean[] flags, Byte[] prefix, Int32 prefix__first, Int32 prefix__ last, __AR_test_class __AR_SL) in test.adb:line 13 at test.test() in test.adb:line 37 at test.main(String[] args)