Бинарные Операторы
Если выражаюсь не понятно, то поясню на конкретике:
// приведу пример желаемого кода (так писать
// нельзя, но так понятней что я хотел)
operator *(r1, r2:TMyRecord):TMyRecord;
begin
.....
end;
....
....
var
a, b:TMyRecord;
begin
....
a := a * b;
....
end;
Мне тут интересно, товарищи из Борланд не сделали ли случайно так, чтобы в Delphi можно было бы задавать свои бинарные операции над структурами (записями, классами, объектами)?
Сделали. Язык называется C#.
Сделали. Язык называется C#.
Да знаю, и язык знаю, да вообще-то даже в СИ++ такое возможно, меня же интересует нет ли чего подобного в Дельфях, или не будет ли.
Просто проблема в том, что один мой тов. не шарит в других языках (кроме Delphi), а мы с ним пишем серьезную программу, в которой очень сильно используется векторная алгебра и векторный анализ, и поэтому мне приходится тоже писать на Delphi. А писать для векторов функции и потом использовать префиксные выражения уже, честно говоря, надоело.
(слава богу дело до тензоров не дошло :) )
Вот наглядный пример:
r := vmul(vsum(a, muls(b, 2)), vdif(d, r));
куда красивее (и удобнее) было бы
r := (a + 2*b)^(d-r); //тут ^ - векторное произв.
в громоздких формулах это имеет решающее значение.
меня же интересует нет ли чего подобного в Дельфях, или не будет ли.
Что планируется в следующей версии Дельфи, одному богу известно. Или черту.
Есть у меня такой замечательный компилер, называется TNT Pascal - он умеет переопределять стандартные бинарные операторы. Поддерживает классы! :) :) :)
Вопрос, тогда такой: можно ли в нем заводить массивчики из ~10^6 векторов (вектор - 3 real-а)?
Вопрос, тогда такой: можно ли в нем заводить массивчики из ~10^6 векторов (вектор - 3 real-а)?
По моему, такое не возбраняется, но ТАКИХ экспериментов я не проводил.
Я тогда сяду и поэксперементирую :)
Заодно, кстати, хотелось бы узнать синтаксис для описания своих бинарных операторов.
hardcase, может ссылочку дашь, а то что-то нигде не могу найти компилер. Или если тебе удобно мне на мыло скинь (хотя вряд ли).
Я тогда сяду и поэксперементирую :)
Заодно, кстати, хотелось бы узнать синтаксис для описания своих бинарных операторов.
Там оЧепятка вышла компилер - TMT Pascal
у меня он версии v3.50, правда для MS_DOS :(
Сайт компании:
http://www.tmt.com/
В нете нашёл ссылку на полноценный (Win32) TMT компилер :) :) :) :
http://arsuit.narod.ru/programming.htm
Заодно, кстати, хотелось бы узнать синтаксис для описания своих бинарных операторов.
Взял из файла справки:
TMT Pascal allows redefining of the standard operators on predefined types and overloading of these operators for new types. For this, it uses the construction
overload
The syntax is:
overload op_sign = qualified procedure identifier;
Where the op_sign is one of the standard operator symbols:
+ - / * = <> < > <= >=
and or xor shl shr mod div in not
+:= -:= *:= /:=
When a re-defined operator is used, TMT Pascal uses the last definition that could be applied toward operands of given types. For example, this fragment:
function add_rr (a, b: Real): Real;
Result := (a + b) * 2;
function add_ii (a, b: Integer): Integer;
Result := (a + b) * 2;
overload + = add_rr;
overload + = add_ii;
redefines the "+" operator. Notice that the order of overload's is important. The reverse order
overload + = add_ii;
overload + = add_rr;
will cause add_rr to be used always since integers can always be cast into reals.
In the SOURCES subdirectory you can find the source of the COMP module which realizes the complex numbers and defines the operators on them.
Remarks:
· The operators +:=, -:=, *:= and /:= have the lowest precedence (lower, than the comparison operators) and are right-associative.
· The operators "+:=" and "-:=" are predefined for all integer and real types.
· The operators "*:=" and "/:=" are predefined for all real types, with the obvious meaning.
А порядок описания важен?
В том смысле что коммутативность операторов иногда может отсутсвовать
например умножение матриц может быть неопределено, если матрицы переставить местами.
Например:
A*B = C
а вот
B*A неопределено.
PS: После ответа можно закрывать тему.
Еще маленький, но важный question
А порядок описания важен?
В том смысле что коммутативность операторов иногда может отсутсвовать
например умножение матриц может быть неопределено, если матрицы переставить местами.
Например:
A*B = C
а вот
B*A неопределено.
Я не знаю, всё в спавке надо смотреть.
Я так полагаю, перегрузка операторов взята из C++ и, похоже, полностью соответствует. :}