4

インラインキャストまたは割り当てを可能にするバリアントレコードタイプパラメーターを使用して関数を作成しようとしています。

type rectype = ( VT_INT, VT_CHAR, VT_BOOL );
     rec = record
       case t : rectype of
         VT_INT  : ( i : integer );
         VT_CHAR : ( c : char );
         VT_BOOL : ( b : boolean );
     end;

procedure handler( r : rec );
begin
  case r.t of
    VT_INT  : { do something with r.i }
    VT_CHAR : { do something with r.c }
    VT_BOOL : { do something with r.b }
  end;
end;

さて、変数を手動で設定するのに時間がかかる限り、上記の「動作」はうまくいきます。

 r.t := VT_INT;
 r.i := 42;
 handler( r );

しかし、私は型付けシステムを少し乱用して、次の行に沿ってインラインで実行しようと思います (理由はすぐに説明します)。

 handler( rec( VT_INT, 42 ) );

ヘルパー関数も同様に問題なく、これを行うためにいくつかの異なる方法を試しました。

http://pastie.org/private/glxhwbpsbbh5gtxju0uvxa

今、理由があります: 私は取り組んでおり、実際に、Pascal 自体と同じくらい移植可能であることを目指している単体テスト スイートをリリースしました (FreePascal および Turbo Pascal 7 でビルドされます (そうです))。私はすでにオープンソース ソフトウェアを公開しています (まだリンクできず、十分な担当者がいません)。これには、さまざまなタイプのさまざまな関数が含まれています: isI()、isR()、isS()、isP()、isC()など。これは多くのコードを繰り返しますが、これを行うためのより良い方法があることを知っています。FPC と Delphi でサポートされているバリアント型があり、これらのプラットフォームで IFDEF ディレクティブを介して使用できると思いますが、本当の決め手は TP7 です。

レコードを設定するために関数呼び出しごとに 4 行が実際に実行可能ではない理由は、これがユーザー向けの API であり、複雑なテストを行うことは、誰もそれを実行しないことを意味するからです。現在の API を使用したテスト セットは、各テストを実行するための 1 つの関数呼び出しで簡単です。いくつかの型固有の関数すべてを次のようなものに変換できることを願っています。

is( VT_INT, SomeIntFunc( v ), 42, 'Test Name' );

アセンブリで自分でスタックを操作するなど、TP7 での入力を回避するために、あらゆる手段を講じるつもりです。

それで、昔ながらの Pascal プログラマー (そこに何人いるに違いないことは知っています)、何か提案はありますか?

4

1 に答える 1

2

Free Pascal は、(カスタム) バリアント、const インターフェイスの配列などの Delphi 構造体、および実行時のタイピングを処理するその他のトリックをサポートしているため (監視可能な数に制限されている限り)、問題ありません。最近の Delphi と FPC はジェネリックをサポートしています。

しかし、それを TP オールドスクールで行うのは難しい部分です。単純に、型指定されていない (より良いのは実行時に型指定された) 機能がほとんどありません。

私が考えることができる唯一のことは

 procedure rec(vartype:Ttypeofvar;var value):tvariantrecord;
 begin
   rec.t:=vartype
   case vartype of 
      vt_int: move (value,@rec.i,sizeof(integer));
      ..
      ..
 end;

rec(varint,"something double") を渡すことができるため、有効な回避策ですが、タイプセーフではありません。TP は、VAR の仮パラメータを除いて、あまり処理する必要がありません。

この時点で、TP7 用にフレームワークを無効にすることが本当に価値があるかどうかを自問する必要があります。死んでからもう16年。安心して腐らせてください。

于 2010-09-10T19:37:13.760 に答える