Операторы в стиле C

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

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

Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Операторы в стиле C

Сообщение Brainenjii »

В FPC есть поддержка операторов в стиле C +=, *= и т.п.
Есть ли флаг, включающий их для свойств, а не только для переменных, и ещё оператор !=?

// маленький примерчик

Код: Выделить всё

program Project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes
  { you can add units after this };

{$R *.res}

Type

{ TMyClass }

TMyClass = Class
  Private
    FOneOfMyDearestAndNearestProperties: Integer;
  Public
    Property OneOfMyDearestAndNearestProperties: Integer
      Read FOneOfMyDearestAndNearestProperties
      Write FOneOfMyDearestAndNearestProperties;
End;

Var
  OneOfMyDearestAndNearestVariables: Integer;
  aMyClass: TMyClass;
begin
  aMyClass := TMyClass.Create;
  aMyClass.OneOfMyDearestAndNearestProperties := 1;
  //aMyClass.OneOfMyDearestAndNearestProperties += 1; // не работает
  aMyClass.OneOfMyDearestAndNearestProperties :=
    aMyClass.OneOfMyDearestAndNearestProperties + 1; // приходится так
  WriteLn(aMyClass.OneOfMyDearestAndNearestProperties);

  OneOfMyDearestAndNearestVariables := 1;
  OneOfMyDearestAndNearestVariables += 1; // как удобно ^_^
  WriteLn(OneOfMyDearestAndNearestVariables);
end.

Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Brainenjii
Не надо включать. Операторы С - это ужас, покрытый липким потом отвращения. :)
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

Они позволяют значительно снизить уровень повторения => они добро ^_^
kipar
новенький
Сообщения: 78
Зарегистрирован: 04.03.2010 11:15:54

Сообщение kipar »

Вместо оператора += есть расовая паскалевская функция Inc(x, n);
Правда она тоже не работает со свойствами по понятной причине (свойство нельзя передать по ссылке).
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Brainenjii писал(а):Они позволяют значительно снизить уровень повторения

И снизить уровень понятности. :) Не все ведь параллельно овладевают С или начинают с него свой нелёгкий труд программиста.
Ask
постоялец
Сообщения: 163
Зарегистрирован: 25.12.2008 02:51:37

Сообщение Ask »

Я тоже активно использую операторы сокращённого присваивания,
и считаю что они более читабельны, чем использование псевдо-процедур типа Inc и Include.
К сожалению, разработчики FPC наотрез отказались реализовывать их для свойств,
несмотря на мои настойчивые попытки их переубедить :(
MageSlayer
постоялец
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44

Сообщение MageSlayer »

Ask писал(а):К сожалению, разработчики FPC наотрез отказались реализовывать их для свойств,несмотря на мои настойчивые попытки их переубедить

Ваши настойчивые попытки не содержали убедительных аргументов.
К счастью для паскаля.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Не надо делать С. Если хочется этих операторов - то почему не писать на самом С?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Давайте подумаем: что такое свойство (property)? Можно сказать, что это особый тип переменной, который имеет два "атрибута" (не соображу как ещё обозвать), это "атрибут" чтения и соответственно записи. Которые в свою очередь могут как ссылаться на переменную внутри класса так и на метод оного. Да ещё и могут вовсе отсутствовать.
И если операции inc, += преобразуются в 2-3 инструкции ассемблера, то как вы представляете, код который будет выполнять операции над свойствами?
Теоретически, конечно можно, но ...

з.ы. Данные конструкции языка конечно удобны, но извините С есть С и нечего его сопоставлять с Pascal. Как бы холивар из темы не вышел.
По мне: вообще пофигу на язык. Какой бы он не был, главное чтобы позволял реализовать замыслы программиста. Про "быдлокодеров" деликатно промолчу :wink:
Ask
постоялец
Сообщения: 163
Зарегистрирован: 25.12.2008 02:51:37

Сообщение Ask »

MageSlayer писал(а):Ваши настойчивые попытки не содержали убедительных аргументов.


Очевидно так, раз не убедил. Однако, Я считаю это существенной потерей для Паскаля.

alexs писал(а):Не надо делать С. Если хочется этих операторов - то почему не писать на самом С?

Mr.Smart писал(а):Данные конструкции языка конечно удобны, но извините С есть С и нечего его сопоставлять с Pascal


Потому что глупо ставить целью дизайна языка "сделать не как в Си". В Си есть ещё, например, операторы "if", "break", "while" --
следуя вашей логике, их следует убрать из Паскаля как некошерные :-)

Mr.Smart писал(а):Давайте подумаем: что такое свойство (property)?...

Далее перечислены истинные утверждения, не не имеющие отношения к обсуждаемому вопросу :-)

Mr.Smart писал(а):как вы представляете, код который будет выполнять операции над свойствами?

Непонятно, зачем мне представлять этот код.
Если мне очень интересно (а мне не очень), Я могу его сгенерировать и посмотреть -- вот например что получается для целочисленного свойства:

Код: Выделить всё

movl   4(%eax),%edx
incl   %edx
movl   -4(%ebp),%eax
call   P$PROGRAM_TT_$__SETP$LONGINT
Сквозняк
энтузиаст
Сообщения: 1159
Зарегистрирован: 29.06.2006 22:08:32

Сообщение Сквозняк »

Потому что глупо ставить целью дизайна языка "сделать не как в Си". В Си есть ещё, например, операторы "if", "break", "while" --
следуя вашей логике, их следует убрать из Паскаля как некошерные

"break" и "while" можете убирать, "for" и "goto" перекроют их возможности с запасом :mrgreen: А если сложные циклы будут ломать стек в лазарусе но отлично работать при {$mode fpc}, то это кого-то заставит не гнаться за новыми фичами а доделать старые.
daesher
постоялец
Сообщения: 221
Зарегистрирован: 09.03.2010 21:17:14

Сообщение daesher »

Думаю, в свойствах следует сделать шаг немного в другом направлении - разрешить использовать их в качестве var-параметров. Да, с точки зрения кода это будет созданием временной переменной (того же типа), присваивании ей значения свойства, вызовом процедуры и присваиванием свойству значения этой переменной. Но насколько будет удобнее! И inc будет работать, но не в этом дело.
А операторов в стиле С я тоже не люблю, хотя они и позволяют что-то сократить. Не паскалевское это! Как и конструкции вида PByte(a)[3] вместо PByteArray(a)^[3]. Для автопреобразования заголовков в модули сгодится, а в повседневных целях - надо избегать.
Ask
постоялец
Сообщения: 163
Зарегистрирован: 25.12.2008 02:51:37

Сообщение Ask »

daesher писал(а):Думаю, в свойствах следует сделать шаг немного в другом направлении - разрешить использовать их в качестве var-параметров.

Вот этого точно не будет. И тут Я с разработчиками не то чтобы совсем согласен, но могу принять их аргументы.
Реализация с помощью временной переменной поменяет семантику, поэтому тут нужен либо новый режим параметров
(предлагалось имя copyinout), либо thunks, что дико сложно.
Кстати, только сегодня Jonas Maebe в комментарии к багу упомянул, что он уже вроде как в принципе не против
сокращённых присваиваний для свойств, так что шансы ещё есть :-)

daesher писал(а):конструкции вида PByte(a)[3] вместо PByteArray(a)^[3]

Арифметика с указателями -- это, конечно, зло (хотя в последней версии сделали немного удобнее),
но в данном конкретном случае не вижу разницы -- range check что так, что этак бесполезен,
а визуально первый вариант даже приятнее.
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

Хочу такие шансы ^_^ Надо-то всего лишь, чтобы компилятор x += y; понимал как x := x + y;
Аватара пользователя
vada
энтузиаст
Сообщения: 691
Зарегистрирован: 14.02.2006 12:43:17

Сообщение vada »

А мне люто не хватает конструкции

Код: Выделить всё

a := (F?b:c);

10 лет на JAVA программировал. Привык, ититить его. :(

И возможности описать переменную в любом месте. Но это уже глумление над паскалем.
Ответить