インラインキャストまたは割り当てを可能にするバリアントレコードタイプパラメーターを使用して関数を作成しようとしています。
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 プログラマー (そこに何人かいるに違いないことは知っています)、何か提案はありますか?