DelphiでMap関数ぽいもの

日曜なのに出勤だったので、ついカッとなってやった


※ map関数は、引数に関数と配列*1を取って、配列のそれぞれに対して与えられた関数を適用させる関数のこと


引数に関数を渡すため、あらかじめ手続き型を宣言しておく(参考: Delphiでコールバック - 飲む、寝る。)。

type
    TProc = procedure(p: Pointer);

引数の型が違うたびに宣言するのは面倒*2なのでポインタ型にして、関数はラッパーを作ってそれを渡すことにしてみた*3

procedure Map(proc: TProc; args: array of Pointer);
var
    i: Integer;
begin
    for i := 0 to High(args) do
        proc(args[i]);
end;

procedure Main;

    procedure WrappedShowMessage(p: Pointer);
    begin
        ShowMessage(String(p^));
    end;

var
    s1, s2, s3: String;
begin
    s1 := '1';
    s2 := '2';
    s3 := '3';
    Map(@WrapedShowMessage, [@s1, @s2, @s3]);
end;

もうちょっと洗練させないと使うことはなさそうだけど…

*1:別に配列に限らないとは思うけど

*2:Map関数もoverloadしなきゃだし

*3:Delphi6なので無名関数が無い