type RangeEnumerator = record strict private FCurrent: integer; FStop: integer; FStep: integer; FPadding: integer; public class function Create(const Start, Stop, Step: integer): RangeEnumerator; static; inline; function MoveNext: boolean; inline; property Current: integer read FCurrent; end; RangeEnumerable = record strict private FEnumerator: RangeEnumerator; public class function Create(const Start, Stop, Step: integer): RangeEnumerable; static; inline; function GetEnumerator(): RangeEnumerator; inline; end; function Range(const Stop: integer): RangeEnumerable; inline; begin result := RangeEnumerable.Create(0, Stop, 1); end; { RangeEnumerator } class function RangeEnumerator.Create(const Start, Stop, Step: integer): RangeEnumerator; begin result.FCurrent := Start; result.FStop := Stop; result.FStep := Step; end; function RangeEnumerator.MoveNext: boolean; var next: integer; begin next := FCurrent + FStep; result := (next < FStop); if (not result) then exit; FCurrent := next; end; { RangeEnumerable } class function RangeEnumerable.Create(const Start, Stop, Step: integer): RangeEnumerable; begin result.FEnumerator := RangeEnumerator.Create(Start, Stop, Step); end; function RangeEnumerable.GetEnumerator: RangeEnumerator; begin result := FEnumerator; end; procedure MatrixMultRange(const A, B: TMatrix; out R: TMatrix); var i, j, k: integer; sum: double; begin Assert(A.m = B.n); R := TMatrix.Create(A.n, B.m); for i in Range(A.n) do begin for j in Range(B.m) do begin sum := 0; for k in Range(A.m) do begin sum := sum + A[i, k] * B[k, j]; end; R[i, j] := sum; end; end; end;