Generics

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Generics

Сообщение zub » 12.11.2016 04:56:19

Люди использующие чистые макросы, ненормальны по определению, думаю, им и Паскаль без надобности, потому что языки высокого уровня именно для того и создавались, что бы не было этой фигни и хоть что-то можно было контролировать.

Согласен, ненормальные. Только зачем тут макросы? Однако ты мешая указатели и неукзатели в одно тело генерика такойже ненормальный))
Что мешает специализировать типом, получать тип-указатель внутри генерика и с этим типом-указателем работать? Генерики работающие с типом и генерики работающие с типом-указателем будут разделены, но специализироваться будут одинаково, типом.

А может кто-то что-то попутал, и забыл, что знак "^" можно опускать, и есть ещё и вот такая директива компилятора: {$X+}, так что обращение через точку ещё не говорит, что там нет разъименования? Фундаментальность ваших знаний - поражает.

Фундаментальный ты наш)) только опускать его можно в {$mode delphi}, а в этом режиме рано или поздно и . запретят, для совместимости (генерики еще очень недоделаны, хотя уже и работают, то конца еще как до китая).
В {$mode objfpc} не опустишь. {$X+} можно ссылку что это? емнип вызов функций без присвоения результата. как оно к разименованию лежит?
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: Generics

Сообщение Лекс Айрин » 12.11.2016 09:56:56

VaalKIA писал(а):Дженерик это тип. Пока нет специализации, не нужна реализация, код можно вообще игнорировать, как только появилась специализация, сразу известно какая именно реализация нужна.


противоречие, однако... чтобы сразу вынь и положь понять как сделать реализацию надо сначала код скомпилировать, а уже потом использовать. Так что проигнорировать ничего нельзя. Фактически, дженерик это базовый объектный тип.

VaalKIA писал(а):А может кто-то что-то попутал, и забыл, что знак "^" можно опускать, и есть ещё и вот такая директива компилятора: {$X+}, так что обращение через точку ещё не говорит, что там нет разъименования?


Попробуйте... практика показывает, что сокращенные способы написания текста программы это попытки выстрелить себе в ногу. Тем более в дженерике. И, кстати, использование специфичных констант в тексте программы это как бы не совсем правильно. А вдруг ее выпилят из новой версии? Конечно вряд ли, но шанс есть.

ЗЫ: И зря вы на zubа бочку катите. Он то как раз их очень плотно использует и знает подавляющую часть подводных камней при их использовании.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Generics

Сообщение zub » 12.11.2016 23:45:23

Код: Выделить всё
program Project1;
{$mode objfpc}{$H+}
{$MODESWITCH ADVANCEDRECORDS}
type
  generic LstTyp<T>=packed record
    type
      PLstTyp=^LstTyp;
    var
    early,Next:PLstTyp;
    Value:T;
  end;

  generic LstEnumerator<T> = record
  type
    LstTypSpecialized=specialize LstTyp <T>;
  private
    lst, lst_save: LstTypSpecialized.PLstTyp;
  public
    constructor Create(const Value: LstTypSpecialized.PLstTyp);
    function GetEnumerator: LstEnumerator;
    function MoveNext: boolean;
    property Current: LstTypSpecialized.PLstTyp read lst;
  end;

  constructor LstEnumerator.Create(const Value: LstTypSpecialized.PLstTyp);
  begin
    lst := Value;
    lst_save := nil;
  end;

  function LstEnumerator.GetEnumerator: LstEnumerator;
  begin
    Result := Self;
  end;

  function LstEnumerator.MoveNext: boolean;
  begin
    if lst <> nil then
    begin
    lst := lst^.next;
    Result := True;
    end else Result := False;
  end;

var
  en01: specialize LstEnumerator<integer>;
  en02: specialize LstEnumerator<string>;
  i01, lst01: en01.LstTypSpecialized.PLstTyp;
  i02, lst02: en02.LstTypSpecialized.PLstTyp;
begin

  for i01 in en01.Create(lst01) do
  begin
    i01^.Value := 10;
  end;

  for i02 in en02.Create(lst02) do
  begin
    i02^.Value := 'ten';
  end;
end.


Добавлено спустя 8 минут 28 секунд:
не факт что скомпилится в 3.0
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: Generics

Сообщение serbod » 13.11.2016 16:14:40

VaalKIA писал(а):Вопрос по дженерикам, вот код итератора:

Код: Выделить всё
type
  LstGrandTyp = ^PLstGrandTyp;
  PLstGrandTyp = packed record
    early, Next: LstGrandTyp;
  end;


Паскаль строго типизирован, поэтому следует четко различать имена типов, указателей, констант и переменных. По префиксам. T=Type, P=Pointer. Это правило, как писать имена с большой буквы. Жаль, компилятор не ругается на несоблюдение этого правила.
Код: Выделить всё
type
  PLstGrandTyp = ^TLstGrandTyp;
  TLstGrandTyp = packed record
    early, Next: PLstGrandTyp;
  end;


Если вы приводите дженерик к какому-то конкретному типу, это значит что дженерик вам не нужен, и надо было сразу этот тип использовать.
Код: Выделить всё
function LstEnumerator.MoveNext: boolean;
begin
  if lst <> nil then
  begin
    PLstGrandTyp(lst) := PLstGrandTyp(lst)^.next; // <- если сделать var lst: PLstGrandTyp, то все будет просто и понятно без дженериков.
    Result := True;
  end
  else
    Result := False;
end;


А вот так делать нельзя:
Код: Выделить всё
for i01 in LstEnumerator<LstTyp01>.Create(lst01) do

Вызывать конструктор без присвоения переменной - очень, очень плохая практика. У переменной есть четкое время жизни - до последнего упоминания. А у созданного "в никуда" объекта время жизни неочевидно - может до конца блока, а может до следующей строки. В большинстве случаев "потеряный" объект продолжает лежать в памяти и может быть вызван. А может память уже вернулась системе или там уже лежит другой объект? Будет ошибка защиты памяти (General Protection Fault). А если объект еще и со счетчиком ссылок, тогда вообще ненепонятно, как он будет себя вести - то ли сразу очистится после создания, то ли будет лежать до закрытия программы.

Дженерики это синтаксический сахар, экономия строк кода. Можно вполне без них обходиться.
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Generics

Сообщение zub » 13.11.2016 17:02:50

VaalKIA
Отпишись про предидущий мой пост.

>>А вот так делать нельзя:
"Делать"-"не делать" пусть компилятор разбирается - если пропускает значит должен разобраться со временем жизни - сахарок конструкции for-in
А вот писать так точно нельзя - предлагантся кусок с делфи синтаксисом подклеить к куску с fpc синтаксисом - как это понимать? С учетом перепутаности P и неP, отсутствия T в названиях типов, отсутствия Т в генериках - разбираться весело.

Код: Выделить всё
generic LstEnumerator<LstTyp> = record//LstTyp можно обозвать и просто T, главное, что бы уникально

не зря пишут T - это обобщенный тип, указав вместо T LstTyp ты для себе подсказываешь что специализировать генерик будешь специализировать типами наподобии LstTyp, но компилятору такой подсказки в виде ограничения не даешь.

Мои претензии к твоим исходникам вполне обоснованы, нефиг обижаться))
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: Generics

Сообщение Alex2013 » 14.11.2016 02:38:35

...
Вопрос снят более внимательным чтением темы (я просто generic-и пока не юзал )
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

Re: Generics

Сообщение VaalKIA » 10.07.2018 14:35:58

Петиция отклонена. https://bugs.freepascal.org/view.php?id=33700
Плохо понимаю английский, поэтому не понял в чём суть. Для меня завршительный диалог выглядит так:
"Это не должно работать, вот примичание к использованию классов"
-"это не использует классы, примеры приведены согласно документации"
"Значит это просто не должно работать, документацию изменим, используйте классы там понятно почему это не работает"

Кто понял о чём речь в петиции, напишите, чем они вообще мотивируют?
VaalKIA
незнакомец
 
Сообщения: 9
Зарегистрирован: 10.11.2016 22:57:58

Re: Generics

Сообщение zub » 10.07.2018 23:09:51

там примерно тоже о чем мы подискутировали когдато давно. предложения PT = ^T; и you need to restrict the type of the template type T
Вы хотите от генериков несколько иного чем вложено туда разрабами, имхо они правы - no change required. а вот тут имхо неправы https://bugs.freepascal.org/view.php?id=33961
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Пред.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 27

Рейтинг@Mail.ru