ноября 15, 2010

Name typization

Ночью, когда спал, придумал механизм типизированных имён.

Динамическая типизация — это когда переменная может принимать значение любого
типа. Как только с переменной нужно проделать какое-то действие (сложение, например),
интерпретатор узнаёт тип переменной, и в зависимости от этого выбирает операцию.
Это очень удобно, не нужно заботиться о явном указании типа. Но работает медленней.

Статическая типизация — это когда у каждой переменной заранее указывается тип,
и к моменту выполнения операции (сложения, например) понятно что нужно делать.
Но указывать типы переменных нужно везде. Это не очень удобно, и мне всегда
этим не нравилась статическая типизация.

[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;


Комментариев нет:

Отправить комментарий

Постоянные читатели

Обо мне

Моя фотография
Мой e-mail: vitek_03(at)mail(dot)ru