ООП: доступ к методу класса из-вне

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

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

Re: ООП: доступ к методу класса из-вне

Сообщение debi12345 » 25.05.2016 21:56:07

{$define sum :=
(a + b)
{$undef a} {$undef b}}

Это не макро-расширение, и инлайн-вычисление.
Код: Выделить всё
(size+1)*sizeof(wchar_t)
тоже работает ? АФАЙК, нет - во всяком случае на старых версиях.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: ООП: доступ к методу класса из-вне

Сообщение скалогрыз » 25.05.2016 22:38:32

ну в паскале, в отличии от ранних версий Си, есть вложенные функции, которые инлайнятся (fpc 2.6.4).
Код: Выделить всё
{$mode delphi}

procedure Hellow;
var
  a,b: integer;

  function sum: integer; inline;
  begin
    result:=a+b+sizeof(widechar);
  end;
begin
  a:=5;
  b:=2;
  writeln(sum);
end;

begin
  hellow;
end.

в итоге синтаксис получается чище и безопаснее, чем при использовании макросов. А эффективность та же (см fpc -al)
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: ООП: доступ к методу класса из-вне

Сообщение debi12345 » 25.05.2016 22:43:19

есть вложенные функции, которые инлайнятся

Далеко не всегда макросы должны возвращать некий результат (который можно обернуть в функции).

ПС: кстати в FPC3 добавили параметрические макросы ?
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: ООП: доступ к методу класса из-вне

Сообщение скалогрыз » 25.05.2016 22:52:29

debi12345 писал(а):Далеко не всегда макросы должны возвращать некий результат (который можно обернуть в функции).

а разве это не проблема №1 для макросов? В тех случаях когда, макрос становится даже не самостоятельным выражением, а лишь частью, он становится опаснее вдвойне.
откуда идёт стремление, писать не однозначно читаемый код?

В конце концов, макросы это не язык Си, это препроцессор. Как бы признаение что язык Си сам по себе не является достаточно удобным, по-этому сверху есть костыль в виде препроцессора.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: ООП: доступ к методу класса из-вне

Сообщение debi12345 » 25.05.2016 23:00:31

Как бы признаение что язык Си сам по себе не является достаточно удобным, по-этому сверху есть костыль в виде препроцессора.

Макросы - логичный довесок к имеющемуся функционалу хэдеров :)
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: ООП: доступ к методу класса из-вне

Сообщение скалогрыз » 25.05.2016 23:07:49

debi12345 писал(а):к имеющемуся функционалу хэдеров

что есть "функционал хэдэров"?
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: ООП: доступ к методу класса из-вне

Сообщение debi12345 » 25.05.2016 23:26:23

что есть "функционал хэдэров"?

Любой, кто работает с С/С++ , тот знает :)
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: ООП: доступ к методу класса из-вне

Сообщение скалогрыз » 25.05.2016 23:32:28

debi12345 писал(а):Любой, кто работает с С/С++ , тот знает

загадки...загадки... предположу что ты ссылаешься на #include, который тоже препроцессор.
Препроцессор является основным тормозом в компиляции Си-шных исходников, т.к. в идеале для каждого компилирумеого файла приходится собирать тонну заголовков. Да, есть precompiled хедеры, но и они не спасают.
А Си++ оброс пространством имён, когда оказалось что большое количество заголовков могут войти друг с другом в конфликт.

насчёт С++, одной из желаемых задач расширения синтаксиса С, было избавление от препроцессора (кто использует C++-ный const, вместо #DEFINE?)...
не фортануло :mrgreen: а всё потому что, что людям от вредных, но приятных привычек избавиться трудно.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: ООП: доступ к методу класса из-вне

Сообщение debi12345 » 26.05.2016 01:00:59

что людям от вредных, но приятных привычек избавиться трудно

Вы когда-нибудь расширения для PostgreSQL писАли (голый "С") ? Там весь маршаллинг и менеджемент памяти и строк (самый кошмар для "С") сделан на дифайнах (местами ППЦ каких сложных) - без них писАть расширения было было на порядок сложнее.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: ООП: доступ к методу класса из-вне

Сообщение скалогрыз » 26.05.2016 01:05:46

debi12345 писал(а):Вы когда-нибудь расширения для PostgreSQL писАли (голый "С") ? Там весь маршаллинг и менеджемент памяти и строк (самый кошмар для "С") сделан на дифайнах (местами ППЦ каких сложных) - без них писАть расширения было было на порядок сложнее.

ну так я об этом и писал выше: "Как бы признаение что язык Си сам по себе не является достаточно удобным, по-этому сверху есть костыль в виде препроцессора".
Но если перпроцессор, это решение для языка Си, почему то же самое решение нужно тащить в другие языки? в частности в паскаль?!

Частный случай использования вложенных функий для замены макросов, был рассмотрен.
И для других случаев можно подобрать вполне паскаль-ориентированне решения, которые не потребуют Си-шного препроцессора.

ЗЫ: если писать расширения для PostgreSQL на голом Си, это наказание, то почему бы не обратиться к другим инструментам? Пример: игра Hedgehog Wars, движок игры написан на паскале, а вот сервер для игры на Хаскеле. Потому что Хаскел оказался более удобным инструментом.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: ООП: доступ к методу класса из-вне

Сообщение debi12345 » 26.05.2016 01:16:40

Но если перпроцессор, это решение для языка Си, почему то же самое решение нужно тащить в другие языки? в частности в паскаль?!

Как отмечалось, у хэдеров есть (а может и был) большой - для сторонних проектов не нужно тащить-загружать все исходники, хотя при нынешних скоростях Интернета это уже не так актуально. Но С-стильных мощных параметрических дифайнов очень бы хотелось в любом языке.

Добавлено спустя 4 минуты 37 секунд:
если писать расширения для PostgreSQL на голом Си, это наказание, то почему бы не обратиться к другим инструментам?

Хм, Вы думаете для я к этому не примеривался ? Цэ була пэрша мысля :)
Ясен перец что чистый С и FPC на 100% совместимы - однако перевести С-шные дифайны (а особенно ядро PostgreSQL) в Pascal - это нужно быть ооочень большим энтузиастом с уймой свободного времени :)
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: ООП: доступ к методу класса из-вне

Сообщение скалогрыз » 26.05.2016 01:21:38

debi12345 писал(а):Как отмечалось, у хэдеров есть (а может и был) большой - для сторонних проектов не нужно тащить-загружать все исходники

А Windows.pas с исходниками винды идёт?
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: ООП: доступ к методу класса из-вне

Сообщение debi12345 » 26.05.2016 01:33:39

Вот пример списка аргументов в сокращенной и наглядной записи (чтобы не "замыливать" зрение и внимание):
Код: Выделить всё
#define PG_MODULE_MAGIC_DATA \
{ \
   sizeof(Pg_magic_struct), \
   PG_VERSION_NUM / 100, \
   FUNC_MAX_ARGS, \
   INDEX_MAX_KEYS, \
   NAMEDATALEN, \
   FLOAT4PASSBYVAL, \
   FLOAT8PASSBYVAL \
}

как это эмулировать без максроса ?

Этот дифайн тоже спасает внимание :
Код: Выделить всё
#define SRF_RETURN_NEXT(_funcctx, _result) \
   do { \
      ReturnSetInfo      *rsi; \
      (_funcctx)->call_cntr++; \
      rsi = (ReturnSetInfo *) fcinfo->resultinfo; \
      rsi->isDone = ExprMultipleResult; \
      PG_RETURN_DATUM(_result); \
   } while (0)


Этот дифайн придает наглядность:
Код: Выделить всё
#define SET_4_BYTES(value)   (((Datum) (value)) & 0xffffffff)



А Windows.pas с исходниками винды идёт?

Чтобы не задавать ехидных вопросов, загляните в исходники PostgreSQL и прикиньте как их паскализировать :)
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: ООП: доступ к методу класса из-вне

Сообщение скалогрыз » 26.05.2016 02:48:18

debi12345 писал(а):Чтобы не задавать ехидных вопросов, загляните в исходники PostgreSQL и прикиньте как их паскализировать

я так понимаю, что не исходники PostgreSQL, а заголовки для расширений? могу посмотреть, если ссылку дадут!
debi12345 писал(а):как это эмулировать без максроса

это не надо эмулировать, просто нужно сконвертировать объявления в читаемый паскалевский синтаксис, которые станут либо типом, либо константой, либо типизированной константой.
debi12345 писал(а):Этот дифайн тоже спасает внимание

inline-функция с заветом вызывать её в стиле.
Код: Выделить всё
Exit ( SRF_RETURN_TEXT( ) );

догадываюсь что PG_RETURN_DATUM это что то вроде return _result ;)

Вот весь этот сыр-бор с дефайнами +1 камень в огород Cи и его препроцессора, т.к. в каждой Си-библиотеке нужно штудировать значение define-ов с нуля. Никакого контроля или стандарта тут нет.
В отличии от паскаля, где такой бардак за просто так развести не удастся, а всё потому что нет препроцессора :D
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: ООП: доступ к методу класса из-вне

Сообщение sign » 26.05.2016 06:57:28

debi12345 писал(а):Макросы - логичный довесок к имеющемуся функционалу хэдеров :)

Функционал?

Э-э-э... Не уподобляйтесь безграмотным москвичам.
Не путайте "функционал" с "функциональностью".
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Пред.След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru