Ночью, когда спал, придумал механизм типизированных имён.
Динамическая типизация — это когда переменная может принимать значение любого
типа. Как только с переменной нужно проделать какое-то действие (сложение, например),
интерпретатор узнаёт тип переменной, и в зависимости от этого выбирает операцию.
Это очень удобно, не нужно заботиться о явном указании типа. Но работает медленней.
Статическая типизация — это когда у каждой переменной заранее указывается тип,
и к моменту выполнения операции (сложения, например) понятно что нужно делать.
Но указывать типы переменных нужно везде. Это не очень удобно, и мне всегда
этим не нравилась статическая типизация.
[Upd] Всё, что идёт ниже, про упрощение статической типизации.
Я осознал, что бывают такие переменные, у которых всегда один и тот же тип.
Например, у меня переменные I и J всегда имеют тип Integer, переменные
Name и FileName тип TString, P тип Pointer и т.д. Было бы весьма удобно иметь
возможность указать привязанные к именам типы, чтобы потом их явно не
указывать. Как-то так:
typization I, J, N, M, K: Integer;
typization Name, FileName, Dir: TString;
procedure LoadFilesInDir(Dir);
var
Files: TArrayOfString;
I;
begin
GetFilesInDir(Dir, Files);
for I := 0 to High(Files) do
LoadFile(Files[I]);
end;
При этом если нужно, то у переменных с такими названиями можно вручную указать
другой тип.
К примеру, в математическом модуле, все переменные с именами M, H, Mat, Matrix будут
являться матрицами, V, A, B, Vec, Vector — векторами, Q, R, Quat и Quaternion —
кватернионами и т.д. Вот было бы хорошо, если бы можно было делать так
typization M, H, Mat, Matrix: TMat4f;
typization V, A, B, Vec, Vector: TVec3f;
typization Q, R, Quat, Quaternion: TQuat;
function Add3f(A, B): TVec3f;
function Dot3f(A, B): TVec3f;
function Cross3f(A, B): TVec3f;
function Len3f(V): Single;
function Apply3f(M, V): TVec3f; overload;
function Apply3f(Q, V): TVec3f; overload;
Возможно, что иногда даже можно бы было не объявлять переменную, компилятор сам
бы создал локальную с таким именем. Например, если в функции используется
переменная I, то скорее всего она локальная и имеет тип Integer (потому что этот
тип указан в typization секции).
procedure LoadFilesInDir(Dir);
var
Files: TArrayOfString;
begin
GetFilesInDir(Dir, Files)
for I := 0 to High(Files) do
LoadFile(Files[I]);
end;
Комментариев нет:
Отправить комментарий