RubyのBlockが欲しいよ
AdaもRubyみたいに関数にブロック渡せればいいのになぁ。
OOPのドット記法みたいに、引数の最初(最後でもいいかも)にaccess {procedure, function}
が来てる場合はブロックをおしりにつなげられるとか。
yield
自体は普通に関数呼び出しでいいから予約後に足さなくてもいけそう。
たとえばmap!がこんな感じに書けるとか。
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
procedure Want_Yield is
type Integer_Array is array (Integer range <>) of Integer;
procedure Map (Block : access procedure (Element : in out Integer);
About : in out Integer_Array) is
begin
for I in About'Range loop
Block (About(I));
end loop;
end Map;
procedure Predefined_Three_Times (I : in out Integer) is
begin
I := I * 3;
end Predefined_Three_Times;
X : Integer_Array (1 .. 3) := (1, 3, 5);
begin
-- 今許されている方法
Map (Predefined_Three_Times'Access, X);
Put (X(1)); Put (X(2)); Put (X(3)); New_Line;
-- Ada15あたりで是非
-- Map (X) (I : in out Integer) do
-- begin
-- I := I * 3;
-- end Map;
-- Put (X(1)); Put (X(2)); Put (X(3)); New_Line;
end Want_Yield;