ないもの?乱入

単に使いどころの無い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)