Вышла новая версия компилятора FreePascal
Модератор: Модераторы
все темы всегда сводятся к строкам 
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
Максим, да она как-то не особо мешает -- у меня используются только встроенные компоненты. Может будет причина разобраться в программировании на API. Все равно это придется делать. Да и не владею я толком английским(((
тут ещё на опеннете прочел о новых возможностях и что то язык превращается в некого монстра:
"пространств имён для юнитов, возможность привязки методов и свойств к простейшим типам"
очень странным выглядит привязка методов и свойств к простым типам
"пространств имён для юнитов, возможность привязки методов и свойств к простейшим типам"
очень странным выглядит привязка методов и свойств к простым типам
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
dedm0zaj, почему? Очень удобная фишка. Посмотрим, как оно будет реализовано.
Фишка очень полезная гипотетически, но пока что малопригодная (или мне не удалось её завести).
Например, я хочу уметь получать в программе хеш от любых данных методом GetHash. Я могу написать:
И тогда от любого AnsiString-значения легко посчитать хеш (AnsiString('Hello').GetHash).
Но если я создам свой теймплейтный класс
и внутри буду использовать TKey.GetHash, то все GetHash-хелперы будут видны только на момент написания дженерика, а не на момент его специализации, поэтому если я уже в клиентском по отношению к THashMap коде сделаю хелпер, скажем, на LongInt, то специализированный дженерик его не увидит. Это делает этот подход к заданию хеш-функции непригодным. А жаль.
И какие ещё могут быть архитектурные (т.е. не просто косметические изменения типа AnsiString('Hello').GetHash вместо GetHash('Hello')) применения у хелперов, кроме тупо наведения красоты?
Например, я хочу уметь получать в программе хеш от любых данных методом GetHash. Я могу написать:
Код: Выделить всё
THashDjb2ForAnsiString = type helper for AnsiString
function GetHash: THash32; inline;
end;
function Djb2(P: PByte; Size: Int64): THash64;
begin
Result := 5381;
while Size > 0 do begin
Result := ((Result shl 5) + Result) + P^;
Inc(P);
Dec(Size);
end;
end;
function THashDjb2ForAnsiString.GetHash: THash32;
begin
Result := Djb2(PByte(@Self[1]), Length(Self));
end;
И тогда от любого AnsiString-значения легко посчитать хеш (AnsiString('Hello').GetHash).
Но если я создам свой теймплейтный класс
Код: Выделить всё
generic THashMap<TKey, TValue> = object
...
end;
и внутри буду использовать TKey.GetHash, то все GetHash-хелперы будут видны только на момент написания дженерика, а не на момент его специализации, поэтому если я уже в клиентском по отношению к THashMap коде сделаю хелпер, скажем, на LongInt, то специализированный дженерик его не увидит. Это делает этот подход к заданию хеш-функции непригодным. А жаль.
И какие ещё могут быть архитектурные (т.е. не просто косметические изменения типа AnsiString('Hello').GetHash вместо GetHash('Hello')) применения у хелперов, кроме тупо наведения красоты?
Лекс Айрин писал(а):dedm0zaj, почему? Очень удобная фишка. Посмотрим, как оно будет реализовано.
это чтобы не писать IntToString(i), а писать i.IntToString?
в принципе удобно при написании программ, когда после i. всплывают варианты, но при чтении мне наверно больше нравтся первый вариант.
хотя, с данным примером это смотрится нормально. но вот более сложные конструкции (которыми кишит java) читаются уже сложно. чтобы узнать что делается в данный момент, нужно перепрыгнуть через кучу объектов с точками и только потом прочесть сам метод. а в первом варианте сразу понимаем что делается и только потом - с чем это делается.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
dedm0zaj, и это тоже. Никто, кстати, не запретит Вам использовать оба способа написания.
а замыкания и анонимные функции добавили ?
А замыкания есть с 2.6.0 («is nested» ссылки)
http://wiki.freepascal.org/FPC_New_Feat ... _variables
http://www.freepascal.org/docs-html/ref/refse17.html
http://wiki.freepascal.org/FPC_New_Feat ... _variables
http://www.freepascal.org/docs-html/ref/refse17.html
Мдя, RTL на юникод (наконец-то!!!) переделали, а у классов с этим по прежнему туго. Бум делать заплатку.
Код: Выделить всё
type
TFileStream = class(THandleStream)
Private
FFileName : UnicodeString;
public
constructor Create(const AFileName: UnicodeString; Mode: Word);
constructor Create(const AFileName: UnicodeString; Mode: Word; Rights: Cardinal);
destructor Destroy; override;
property FileName : UnicodeString Read FFilename;
end;
........
constructor TFileStream.Create(const AFileName: UnicodeString; Mode: Word);
begin
Create(AFileName,Mode,438);
end;
constructor TFileStream.Create(const AFileName: UnicodeString; Mode: Word; Rights: Cardinal);
begin
FFileName:=AFileName;
If (Mode and fmCreate) > 0 then
FHandle:=FileCreate(AFileName,Mode,Rights)
else
FHAndle:=FileOpen(AFileName,Mode);
If (THandle(FHandle)=feInvalidHandle) then
If Mode=fmcreate then
raise EFCreateError.createfmt(SFCreateError,[AFileName])
else
raise EFOpenError.Createfmt(SFOpenError,[AFilename]);
end; - Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
В крайнем снапшоте удалось пересобрать Лазарус. То есть, проблема с русскими символами в путях поправлена.
Дож писал(а):А замыкания есть с 2.6.0 («is nested» ссылки)
http://wiki.freepascal.org/FPC_New_Feat ... _variables
http://www.freepascal.org/docs-html/ref/refse17.html
я имел ввиду чтото вменяемое
типа как в C++
Код: Выделить всё
auto lambda = [](auto x) {
return x;
};
типа используем
writeln(lambda("Hello generic lambda!\n"));
объявление сразу в блоке кода и присваивание переменной
будет такое?
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
perlpunkа зачем нам второй C++? Объявление в блоке кода как бы противоречит идеологии Паскаля.
