Вышла новая версия компилятора FreePascal

Вопросы программирования на Free Pascal, использования компилятора и утилит.

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

Re: Вышла новая версия компилятора FreePascal

Сообщение Лекс Айрин » 14.12.2015 19:09:43

kazalex писал(а):Если тебя сейчас посадить за Виртовский паскаль ты по другому заговоришь.


Было время и я вполне использовал турбопаскаль в объеме виртовского функционала.... это не проблема. В конце-концов, в все языки превращаются в бинарный код. Я даже успел неплохо поюзать бейсик на агате. Более того, я очень долго не мог понять идеологию программирования под виндовс. У меня программа распадалась на кучу несвязанных между собой конструкций.
kazalex писал(а):Неконсистентность RTL и LCL это не проблема новых строк.

Конечно... это лишь причина появления несогласованности. И, как следствие, проблем.

kazalex писал(а):Что, и тут дельфя мешает развиваться?


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

Не зря же Борланд его в конце-концов выкинула из своей обоймы, хотя долгое время это был один из основных источников ее популярности.

kazalex писал(а):Не с системы на систему, а с популярнейшего диалекта паскаля на компилятор в котором заявлена поддержка этого диалекта.

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

И, кстати, единственная причина перехода на FPC (Lazarus) это поддержка кроссплатформенности, а значит возможности запуска программы под другой осью. Но не все программы, даже написанные на Lazarus кроссплатформенны в принципе.

Фактически, уже сейчас FPC, насколько мне известно, делится на две ветки. Стандартную и Мартиновскую. Ну или вот-вот начнет.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Вышла новая версия компилятора FreePascal

Сообщение Mikhail » 14.12.2015 19:48:06

kazalex писал(а):Замыкания не присущи какому-то одному языку, поэтому их наличие в паскале не сделает его тем "другим языком", это просто очень удобная в некоторых случаях абстракция.


Замыкания это все-таки "фишка" из мира функционального программирования, зачем это нужно в императивном Паскале?
Mikhail
энтузиаст
 
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Re: Вышла новая версия компилятора FreePascal

Сообщение Дож » 14.12.2015 19:57:21

Mikhail писал(а):
kazalex писал(а):Замыкания не присущи какому-то одному языку, поэтому их наличие в паскале не сделает его тем "другим языком", это просто очень удобная в некоторых случаях абстракция.


Замыкания это все-таки "фишка" из мира функционального программирования, зачем это нужно в императивном Паскале?

Может и сохранение ссылок на функции и методы в переменных не нужно в императивном Паскале?
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Вышла новая версия компилятора FreePascal

Сообщение Mikhail » 14.12.2015 20:10:50

Дож писал(а):Может и сохранение ссылок на функции и методы в переменных не нужно в императивном Паскале?

Это не противоречит императивной парадигме, в отличие от замыканий.
Mikhail
энтузиаст
 
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Re: Вышла новая версия компилятора FreePascal

Сообщение Дож » 14.12.2015 20:22:16

Mikhail писал(а):
Дож писал(а):Может и сохранение ссылок на функции и методы в переменных не нужно в императивном Паскале?

Это не противоречит императивной парадигме, в отличие от замыканий.

Т.е. Вы утверждаете, что вот такой код
Код: Выделить всё
procedure Sort(Reverse: Boolean);
  function LessThan(A, B: LongInt);
  begin
    if Reverse then
      Result := A < B
    else
      Result := B < A;
  end;
begin
  SomeGlobalArray.Sort(@LessThan);
end;

является сугубо функциональным, противоречит глубинным идеям паскаля и такое ему не нужно, а вот такой код
Код: Выделить всё
var
  Reverse;

function LessThan(A, B: LongInt);
begin
  if Reverse then
    Result := A < B
  else
    Result := B < A;
end;

procedure Sort(_Reverse: Boolean);
begin
  Reverse := _Reverse;
  SomeGlobalArray.Sort(@LessThan);
end;

ни разу не противоречит?

Я напоминаю, что замыкания — это не анонимные функции, а такие функции, которые ссылаются на локальные переменные внешней функции.
https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BC%D1%8B%D0%BA%D0%B0%D0%BD%D0%B8%D0%B5_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Вышла новая версия компилятора FreePascal

Сообщение Mikhail » 14.12.2015 20:37:12

Дож писал(а):
Mikhail писал(а):
Дож писал(а):Может и сохранение ссылок на функции и методы в переменных не нужно в императивном Паскале?

Это не противоречит императивной парадигме, в отличие от замыканий.

Т.е. Вы утверждаете, что вот такой код
Код: Выделить всё
procedure Sort(Reverse: Boolean);
  function LessThan(A, B: LongInt);
  begin
    if Reverse then
      Result := A < B
    else
      Result := B < A;
  end;
begin
  SomeGlobalArray.Sort(@LessThan);
end;

является сугубо функциональным, противоречит глубинным идеям паскаля и такое ему не нужно, а вот такой код
Код: Выделить всё
var
  Reverse;

function LessThan(A, B: LongInt);
begin
  if Reverse then
    Result := A < B
  else
    Result := B < A;
end;

procedure Sort(_Reverse: Boolean);
begin
  Reverse := _Reverse;
  SomeGlobalArray.Sort(@LessThan);
end;

ни разу не противоречит?

Я напоминаю, что замыкания — это не анонимные функции, а такие функции, которые ссылаются на локальные переменные внешней функции.
https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BC%D1%8B%D0%BA%D0%B0%D0%BD%D0%B8%D0%B5_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29

Вы хотите сказать что этот код рабочий?
Замыкания придумали для реализации абстракции (инкапсуляции) в функциональных ЯП, там нельзя явно хранить состояние, нет глобальных переменных, но иногда это нужно. В императивных языках нет никакой необходимости в этом, абсолютно. Пихать замыкания куда не попади это просто дать моде. Ну и еще их любят программисты на JS, т.к. этот костыль там достаточно широко используется.
Mikhail
энтузиаст
 
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Re: Вышла новая версия компилятора FreePascal

Сообщение Лекс Айрин » 14.12.2015 20:38:56

Дож писал(а):Я напоминаю, что замыкания — это не анонимные функции, а такие функции, которые ссылаются на локальные переменные внешней функции.


Если что, то все переменные используемые в функции/процедуре, должны быть описаны в ней самой и/или получены при запуске функции. Использование иных методов передачи не рекомендуется из-за различных побочных эффектов. Даже использование внешних глобально объявленных переменных/констант это УЖЕ будущие проблемы с поддержкой программы.
И, кстати, оба примера в ПАСКАЛЕ, вызовут сообщения об ошибке. Ибо функций без выдаваемых значений не бывает.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Вышла новая версия компилятора FreePascal

Сообщение Дож » 14.12.2015 21:07:13

Mikhail писал(а):Вы хотите сказать что этот код рабочий?

Если это не придирка к опечатке уровня Лекса Айрина, то, конечно, рабочий:
Код: Выделить всё
{$MODE OBJFPC}
{$MODESWITCH NESTEDPROCVARS}

type
  TLessThan = function (A, B: LongInt): Boolean is nested;

procedure GlobalSort(LessThan: TLessThan);
begin
  Writeln(LessThan(100, 0));
end;

procedure Sort(Reverse: Boolean);
  function LessThan(A, B: LongInt): Boolean;
  begin
    if Reverse then
      Result := A < B
    else
      Result := B < A;
  end;
begin
  GlobalSort(@LessThan);
end;

begin
  Sort(False);
  Sort(True);
end.


Печатает
TRUE
FALSE

Описание фичи:
http://wiki.freepascal.org/FPC_New_Feat ... _variables

Замыкания придумали для реализации абстракции (инкапсуляции) в функциональных ЯП, там нельзя явно хранить состояние, нет глобальных переменных, но иногда это нужно. В императивных языках нет никакой необходимости в этом, абсолютно.

Я только что привёл пример кода, в котором функция-сравнение передаётся ссылкой, которую предполагается использовать для сортировки массива. Код ИМХО получился читаемым и вполне себе Pascal-Way, кратким, всё везде описано в явном виде, типы соблюдены, а вложенные функции поддерживаются с древних времён.

Предложите другое решение задачи абстрагирования алгоритма сравнения двух элементов, читаемое, Pascal-Way, без хаков и без nested-функций.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Вышла новая версия компилятора FreePascal

Сообщение Лекс Айрин » 14.12.2015 21:24:10

Дож писал(а):Если это не придирка к опечатке...

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

И в Pascal-Wey нет возможности абстрактного сравнения. Кстати, обидно, что язык-чемоданчик превращается в язык-сундук. В FPC есть много модных и дублирующих друг-друга конструкций... причем каждая со своими побочными эффектами и фишками... это все лишнее. От этого придется когда-нибудь избавляться... или язык забудут. Ибо он просто не будет удовлетворять достаточное количество программистов.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Вышла новая версия компилятора FreePascal

Сообщение Дож » 14.12.2015 21:34:03

Вообще-то различие процедуры и функции это одна из ключевых особенностей паскаля...

Бред, различие процедуры и функции — это особенность паскаля, но не ключевая ни разу :D

— Нам нужно разработать новый софт. Мы должны рисовать таблицу со всякими шнягами из базы данных. И если пользователь имеет тип босс, то нужно рисовать дополнительные колонки и ещё кнопку. На чём будем писать, подскажите, эксперт Лекс?
— Конечно же на паскале! Ведь в нём процедуры и функции различаются, это очень важно.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Вышла новая версия компилятора FreePascal

Сообщение Mikhail » 14.12.2015 21:40:49

Дож писал(а):Предложите другое решение задачи абстрагирования алгоритма сравнения двух элементов, читаемое, Pascal-Way, без хаков и без nested-функций.


Глобальная переменная, явная передача параметра хранящего состояние или, что тоже самое, объект и указатель на метод.
Mikhail
энтузиаст
 
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Re: Вышла новая версия компилятора FreePascal

Сообщение Дож » 14.12.2015 21:47:46

Mikhail писал(а):
Дож писал(а):Предложите другое решение задачи абстрагирования алгоритма сравнения двух элементов, читаемое, Pascal-Way, без хаков и без nested-функций.

Глобальная переменная

Решение годится, но имеет известные проблемы глобальных переменных (конкурентность при многопоточности; возможные типичные ошибки с залипанием значений).

явная передача параметра хранящего состояние

Тоже годится, но некрасиво в библиотечном коде прописывать ещё и состояние (лапшеобразность некоторая появляется).

или, что тоже самое, объект и указатель на метод.

Самое лучшее, но многословное (объект нужно объявить, описать конструктор и метод, создать и уничтожить, — итого на 10-15 строк больше решения через is nested ссылку).

Действительно ли каждое из этих трёх решений лучше решения через is nested ссылку?
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Вышла новая версия компилятора FreePascal

Сообщение Mikhail » 14.12.2015 21:54:11

Дож писал(а):Действительно ли каждое из этих трёх решений лучше решения через is nested ссылку?


Да лучше, они лучше для сопровождения.
Кстати, а какое время жизни у такой переменной и как вообще в FPC в этом случае осуществляется управление памятью? В функциональных ЯП для этого используется GC, а здесь как?
Mikhail
энтузиаст
 
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Re: Вышла новая версия компилятора FreePascal

Сообщение Дож » 14.12.2015 22:11:53

Кстати, а какое время жизни у такой переменной и как вообще в FPC в этом случае осуществляется управление памятью?

Ссылка на вложенную функцию — это как ссылка на обычную функцию, только есть ещё неявный параметр — ссылка на стек родительской функции, через которую можно обращаться к локальным переменным родительской функции. Никакого специального управления памятью в этом месте нет и не требуется.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Вышла новая версия компилятора FreePascal

Сообщение Mikhail » 14.12.2015 22:46:55

Дож писал(а):
Кстати, а какое время жизни у такой переменной и как вообще в FPC в этом случае осуществляется управление памятью?

Ссылка на вложенную функцию — это как ссылка на обычную функцию, только есть ещё неявный параметр — ссылка на стек родительской функции, через которую можно обращаться к локальным переменным родительской функции. Никакого специального управления памятью в этом месте нет и не требуется.

т.е. так работать не будет?
Код: Выделить всё
{$mode objfpc}{$H+}
{$MODESWITCH NESTEDPROCVARS}
program project1;
type TAdd = function (A, B: Integer): Integer is nested;

procedure Create(var T: TAdd; AC: Integer);
var C: Integer;
function Add(A, B: Integer): Integer;
begin
  Result :=A + B*C;
end;

begin
C:=AC;
T:=@Add;
end;

var T1, T2: TAdd;
begin
Create(T1, 1);
Create(T2, 2);
writeln(T1(1,1));
writeln(T2(1,1));
end.     
Mikhail
энтузиаст
 
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Пред.След.

Вернуться в Free Pascal Compiler

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

Рейтинг@Mail.ru