Модератор: Модераторы
Дож писал(а):всё больше разочаровываюсь в компиляторе и сейчас кроме как словами «по инерции» аргументировать выбор именно его не могу.
Что именно Вас разочаровывает?
{$MODE OBJFPC}
type
generic G<T> = record
case l: LongInt of
0: (x: T;)
end;
begin
end.
gen.pas(5,11) Error: Type parameters may require initialization/finalization - cannot be used in variant records
Дож писал(а):По ортогональности фичей: для примера возьмём фичу из 3.0...Типа круто, можно расширять базовые типы. Но
1. Для одного типа всегда виден только один хелпер (самый последний), опять эти вездесущие конфликты объявлений.[/*]
2. Для class'а хелперы есть, для record'а хелперы есть, для примитивных типов появилось. А для object'а где?[/*]
И я не удивлюсь, если ещё какие-нибудь грабли есть, если начать пользоваться хелперами на практике.
Дож писал(а):Например, почему в строго типизированном языке программирования, коим паскаль позиционируется, оператор @ возвращает тип Pointer, который можно передать в функцию как любой типизированный аргумент?
The @ operator returns a typed pointer if the $T switch is on. If the $T switch is off then the address operator returns an untyped pointer, which is assigment compatible with all pointer types. The type of the pointer is ^T, where T is the type of the variable reference.
In the {$T+} or {$TYPEDADDRESS ON} state, the @ operator, when applied to a variable, returns a result of type ^T, if the type of the variable is T. In the {$T-} state, the result is always an untyped pointer, which is assignment compatible with all other pointer types.
И потом, если с хелперами много граблей, какой смысл их вообще прикручивать к объектам?
Дож писал(а):Сами по себе хелперы довольно полезная штука, помогают улучшить ту самую ортагонализацию возможностей, если их довести до ума.
Дож писал(а):Если я хочу сделать много глобальных функций Max, Intersect, Sort, IfThen и т.д., и для разных типов, разнесённых по разным модулям, то у меня ничего не выйдет, потому что функция из одного модуля полностью закроет функцию другого модуля с таким же названием
Дож писал(а):Для одного типа всегда виден только один хелпер (самый последний), опять эти вездесущие конфликты объявлений.
program Project1;
{$mode objfpc}
{$modeswitch typehelpers}
type
{ inthelper }
inthelper = type helper for integer
procedure test;
end;
{ inthelper2 }
inthelper2 = type helper (inthelper) for integer
procedure test2;
end;
{ inthelper }
procedure inthelper.test;
begin
writeln('test');
end;
{ inthelper2 }
procedure inthelper2.test2;
begin
writeln('test2');
end;
var i : Integer;
begin
i.test;
i.test2;
readln;
end.
function ToString(AValue : Integer) : String; Helper;
...
var i : Integer;
integer.ToString(i);
i.ToString;
Дож писал(а):ли я хочу сделать много глобальных функций Max, Intersect, Sort, IfThen и т.д., и для разных типов, разнесённых по разным модулям, то у меня ничего не выйдет, потому что функция из одного модуля полностью закроет функцию другого модуля с таким же названием. А неймспейсы и конструкции вида UnitName.Max подрывают идею перегруженных функций, к тому же with UnitName do не работает.
{$ifdef fpc}{$mode delphi}{$endif}
uses
maxint, maxstr;
begin
writeln(max('aaa','bbb'));
writeln(max(5,6));
end.
unit maxstr;
interface
{$ifdef fpc}{$mode delphi}{$h+}{$endif}
function Max(const a,b: string): string; overload;
implementation
function Max(const a,b: string): string; overload;
begin
if a>b then Result:=a
else Result:=b;
end;
end.
unit maxint;
interface
{$ifdef fpc}{$mode delphi}{$h+}{$endif}
function Max(const a,b: Integer): Integer; overload;
implementation
function Max(const a,b: Integer): Integer; overload;
begin
if a>b then Result:=a
else Result:=b;
end;
end.
скалогрыз писал(а):я забыл сказать, что ортогональные изменения обычно связаны с догонялками делфи
kazalex писал(а):Они, скорее, связаны с качеством проработки фич. В собственном-то диалекте никаких догонялок не требуется.
скалогрыз писал(а):имхо, проблема в том, что фичу добавить можно в язык, а вот убрать сложнее.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4