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

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

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

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

Сообщение Лекс Айрин » 25.12.2015 12:14:11

kazalex писал(а):Только в современном паскале дохрена магии, которая средствами библиотек не реализуется совсем т.к. языковых средств не хватает.

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

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

Сообщение Kemet » 25.12.2015 12:29:13

Mikhail писал(а):А в языках с GC сырых указателей просто нет, в отличие от FPC.
Есть
Kemet
постоялец
 
Сообщения: 241
Зарегистрирован: 10.02.2010 19:28:32
Откуда: Временно оккупированная территория

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

Сообщение kazalex » 25.12.2015 12:47:36

Лекс Айрин писал(а):А может, ну ее эту магию? Может мы просто не тем путем идем? Может надо подумать как раз над оригинальными и действительно нужными средствами?

Ну так если были бы необходимые средства в языке, то и часть магии была бы не нужна. В дельфях, с появлением avanced records и перегрузки операторов, просят добавить возможность перегружать операторы для инициализации/финализации и копирования. Сейчас всё это является компиляторной магией, а будь они доступны в языке, то все управляемые типы можно было бы перенести в RTL и вместо насильного впендюривания ARC на уровень базового класса можно было бы сделать безопасные смартпоинтеры с минимальным оверхедом.
kazalex
постоялец
 
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

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

Сообщение Лекс Айрин » 25.12.2015 13:00:31

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

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

Сообщение kazalex » 25.12.2015 13:20:57

Лекс Айрин писал(а):перенос компиляторной магии на уровень языка мало что изменит

Шутишь что-ли? Это как раз сильно увеличивает возможности языка. Будь это реализовано, любой желающий давно мог бы использовать те же смартпоинтеры без необходимости ждать, когда их или аналогичную возможность допилят в компиляторе.

Добавлено спустя 3 минуты 2 секунды:
Ещё забыл добавить, что это позволило бы снизить издержки на работу финализаторов, которые на сегодняшний день для работы используют RTTI.
kazalex
постоялец
 
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

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

Сообщение alexs » 25.12.2015 14:28:49

kazalex писал(а):Ответ прост и следует из самого смысла замыканий - захват локального контекста.

Калбэк нормально написать сложно? Надо делать через...?
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

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

Сообщение Дож » 25.12.2015 14:39:38

alexs писал(а):
kazalex писал(а):Ответ прост и следует из самого смысла замыканий - захват локального контекста.

Калбэк нормально написать сложно? Надо делать через...?

Код: Выделить всё
type
  TCallback = ...;

procedure SomeFunc;
var
  A1: LongInt;
  A2: AnsiString;
  A3: BalBlaBla;
  Callback: TCallback;
begin
  Callback := procedrue; // Записываем в переменную процедуру
    begin
      Writeln(A1, ' ', A2, ' ', A3); // Сразу видим что эта процедура делает
    end;
  RunAlgo(Callback); // Передаём коллбэк
  // Код читается сверху вниз с одного захода
end;


Код: Выделить всё
procedure SomeFunc;
var
  A1: LongInt;
  A2: AnsiString;
  A3: BalBlaBla;
  // Что это за класс? Надо лезть в описание класса
  MyCallbackWrapper: TMyCallbackWrapper;
begin
  // Что делает конструктор? Надо сходить в то места, где конструктор реализован
  MyCallbackWrapper := TMyCallbackWrapper.Create(A1, A2, A3);
  RunAlgo(MyCallbackWrapper.Callback); // Передаём коллбэк
  MyCallbackWrapper.Free;
end;

...

// Лезем в описание класса, видим:
type
TMyCallbackWrapper = class
private
  FA1: LongInt;
  FA2: AnsiString;
  FA3: BalBlaBla;
public
  constructor Create(A1: LongInt; A2: AnsiString; A3: Blablabla);
  procedure Callback;
end;
// Супер — прочли 10 механически написанных строк

...

// Смотрим дальше — конструктор
constructor TMyCallbackWrapper.Create(A1: LongInt; A2: AnsiString; A3: Blablabla);
begin
  FA1 := A1;
  FA2 := A2;
  FA3 := A3;
  // Сюрпрайз! Прочтено ещё 6 механически написанных строк
end;

...

procedure TMyCallbackWrapper.Callback;
begin
  Writeln(FA1, ' ', FA2, ' ', FA3); // <-- Всё ради одной вот этой строки
end;


Ну и где здесь написан «калбэк через г...», а где по-нормальному? :)
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

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

Сообщение kazalex » 25.12.2015 14:58:07

Дож
Дож писал(а):Ну и где здесь написан «калбэк через г...», а где по-нормальному? :)

+1
Ты там ещё try...finally опустил, что тоже не добавляет красоты и простоты. А если колбек ещё и пожить должен...
kazalex
постоялец
 
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

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

Сообщение alexs » 25.12.2015 14:58:37

Дож писал(а):Callback := procedrue; // Записываем в переменную процедуру
begin
Writeln(A1, ' ', A2, ' ', A3); // Сразу видим что эта процедура делает
end;

А как вот это назвать? Печатных слов нет.
Или вы пишите код 1 раз и в последующем его не спровождаете вообще? Или это будет потом наказание для провинившихся?
НАФИГ... НАФИГ...

А второй пример вообще не понял. Делегирование?
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

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

Сообщение Дож » 25.12.2015 15:04:02

Или вы пишите код 1 раз и в последующем его не спровождаете вообще? Или это будет потом наказание для провинившихся?

Я написал в комментариях как этот код читается — он читается хорошо.

А второй пример вообще не понял. Делегирование?

Нет, то, как коллбеки передаются сейчас (по моему мнению).
Последний раз редактировалось Дож 25.12.2015 15:06:01, всего редактировалось 1 раз.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

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

Сообщение Лекс Айрин » 25.12.2015 15:04:47

kazalex писал(а):Шутишь что-ли? Это как раз сильно увеличивает возможности языка.

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

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

Сообщение kazalex » 25.12.2015 15:05:33

alexs писал(а):Или вы пишите код 1 раз и в последующем его не спровождаете вообще?

Как раз сопровождать код с анонимными методами сильно проще, т.к. в случае изменившегося контекста ты запаришься свои колбеки рефакторить.

alexs писал(а):А второй пример вообще не понял. Делегирование?

Тебе показали закат солнца вручную, то есть ручной захват контекста. Что там непонятного и причём тут делегирование?

Добавлено спустя 1 минуту 3 секунды:
Лекс Айрин писал(а):чем сложнее язык сам по себе, тем меньше его мощность

Чушь какая...
kazalex
постоялец
 
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

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

Сообщение Лекс Айрин » 25.12.2015 15:10:37

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

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

Сообщение Дож » 25.12.2015 15:13:13

Что-то мне кажется, что и один и другой способ немного напоминает работу гинеколога по оклейке квартиры.

Научите нас оклеивать квартиру правильно, а то мы по-другому не умеем.

(Вариант «жить с голыми бетонными стенами без обоев» не предлагать.)
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

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

Сообщение Лекс Айрин » 25.12.2015 15:35:37

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

Код: Выделить всё
//Процедура обработки оконных сообщений
Function WindowProc(wnd:HWND; Msg : Dword; Wparam:Wparam; Lparam: Lparam): Lresult; stdcall; //
// заменил integer на DWord и все заработало)))
begin
  case msg of
    wm_destroy, wm_close : postquitmessage(0); //Событие закрытия или удаления окна 
  else
    Result := DefWindowProc(wnd, msg, wparam, lparam);
  end;
end;

//Процедура регистрации класса основного окна
Procedure RegWinClass;
Var
  wc: WNDCLASS;
  err: dword;

Begin
  ...
  wc.lpfnWndProc:=@WindowProc;
  ....

Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Пред.След.

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

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

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

Рейтинг@Mail.ru