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

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

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

Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

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

vada вот эта конструкция не помешала бы.
daesher
постоялец
Сообщения: 221
Зарегистрирован: 09.03.2010 21:17:14

Сообщение daesher »

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

Арифметика с указателями -- это, конечно, зло (хотя в последней версии сделали немного удобнее),
но в данном конкретном случае не вижу разницы -- range check что так, что этак бесполезен,
а визуально первый вариант даже приятнее.

Визуально он короче, но выглядит менее осмысленно. Вдумайтесь: третий элемент массива, который на самом деле не массив, а указатель на байт. Где здесь логика языка Паскаль? Я, конечно, понимаю, что в С так принято, но при чём здесь Паскаль? Думаю, такие вещи надо сопровождать Warning: poor Pascal code.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Ask писал(а):Потому что глупо ставить целью дизайна языка "сделать не как в Си".

Вы абсолютно не правильно поняли суть наших высказываний.
Данные операторы не способствуют повышению читабильности исходного кода. Смысыл всех паскалеподобных языков в том, что они отчасти сами являются документацией. Т.е. максимально приближены к естественному языку. С в этом смысле гораздо хуже приспособлен для чтения исходных текстов.
Ask
постоялец
Сообщения: 163
Зарегистрирован: 25.12.2008 02:51:37

Сообщение Ask »

alexs писал(а):Вы абсолютно не правильно поняли суть наших высказываний.

Что и неудивительно, поскольку Я читал только их, а не ваши мысли :-)

Данные операторы не способствуют повышению читабильности исходного кода.

Читабельность, конечно, отчасти вопрос вкуса, но принцип DRY Я считаю объективным критерием.
Операторы сокращенного присваивания позволяют применить этот принцип в достаточно важном частном случае,
вот например как в этой строке из Lazarus:

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

FGraphPoints[i - FLoBound].X += AxisToGraphY(Source[i]^.YList[AIndex])

Я решительно утверждаю, что переписывать её в виде

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

FGraphPoints[i - FLoBound].X := FGraphPoints[i - FLoBound].X + AxisToGraphY(Source[i]^.YList[AIndex])

или

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

with FGraphPoints[i - FLoBound] do X  := X + AxisToGraphY(Source[i]^.YList[AIndex])

менее читабельно.
Более того, Я полагаю, что
x += 1 более читабельно, чем Inc(x), поскольку визуально выделяет оператор присваивания
в отличие от простого вызова функции. Конечно, это уже более субъективное мнение.

alexs писал(а):Смысыл всех паскалеподобных языков в том, что они отчасти сами являются документацией. Т.е. максимально приближены к естественному языку. С в этом смысле гораздо хуже приспособлен для чтения исходных текстов.

Смысл -- тоже понятие растяжимое, однако можно с достаточной степенью объективности утверждать, что все три вышеперечисленные утверждения неверны:
1) "Максимально приближенный к естественному языку" был Кобол, и, в меньшей степени, его современный наследник SQL.
В счастью, человечество быстро поняло, что языки, слишком близкие к естественному, снижают читабельность программ.
2) Действительно, для каждого конкретного программиста имеется наиболее комфортабельная плотность синтаксической информации на один символ. Существенное подмножество программистов предпочитает более низкую плотность Паскаля и Питона по сравнению с
более плотными Си и Перл. Однако, как я говорил, плотность -- это одно, а DRY -- совсем другое, значительно более важное свойство.
3) Меня вообще удивляют упорные попытки сравнивать (современный) Паскаль с Си. Такое ощущение, что аудиенция данного сайта обучалась программировать, когда Я обучался ходить :) Это сравнение было адекватным в 70'е годы, когда действительно был флейм между Виртом и K&R.
Object Pascal -- совершенно другой язык. Си предназначен для системного программирования, в то время как Object Pascal -- для прикладного. У этих языков практически нулевая область пересечения приложений (кроме, пожалуй, олимпиадных задач).
Лучшими сравнениями будет C#, как идеологический преемник, и Python, как идеологический аналог, хоть и интерпретируемый.
files32
новенький
Сообщения: 24
Зарегистрирован: 27.10.2007 13:42:41

Сообщение files32 »

Мне тоже более понятны += чем inc(). Это дела вкуса

Т.е. максимально приближены к естественному языку

Тогда конструкции нужно переводить так
x := x+2 // К иксу прибавляем два и записываем в икс.
x += 2 // К иксу добавляем два.

Разницу подсветил. И то и то выражение в русском языке являются допустимыми. Почему же их аналогии на паскале должны быть не допустимы?
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Сообщение Maxizar »

Думал не буду отвечать, но не сдержался :(

alexs - получает +1 в башню.

Мне тоже более понятны += чем inc().


Эээ вы это за правду.... операции вида += на самом деле раскрывают себя только в C++, при перегрузке операторов, спасая от создания копии аргумента и впринцыпе на этом все.

Теперь про теже указатели.
В паскале взятие адреса и разименоавние указателя даже обозночаются по разному (@, ^) тогда как в С только *.
Всегда привожу один и тот же пример сравнения адресов
Pascal

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

  (@A and @B) 

C

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

 (&A & &B) 


Не ну правда, зачем вы себя мучаете пишите на С, зачем портить себя и свой мозг .... и ..... Pascal-ем.

PS. Я благодарен разрабам за то что они не допустили такое в Free Pascal.
files32
новенький
Сообщения: 24
Зарегистрирован: 27.10.2007 13:42:41

Сообщение files32 »

Не ну правда, зачем вы себя мучаете пишите на С, зачем портить себя и свой мозг .... и ..... Pascal-ем.

А не кто не мучается. Разрабам +1, что добавили такую возможность включать через директивы компилятора. Кому надо - пусть использует. Язык программирования должен быть для человека, а не наоборот.
eastorwest
новенький
Сообщения: 57
Зарегистрирован: 23.07.2009 20:21:46
Откуда: Н-ск

Сообщение eastorwest »

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

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

a := (F?b:c);


Обратите внимание на модуль RTL.Math. В списке функций имеется ifthen( ), с помощью которой в FPC/Delphi ваша конструкция примет вид:

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

a := ifthen(F,b,c);
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

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

eastorwest принять то она примет, но отработают оба параметра b и c. http://freepascal.ru/forum/viewtopic.php?f=1&t=6228
Аватара пользователя
vada
энтузиаст
Сообщения: 691
Зарегистрирован: 14.02.2006 12:43:17

Сообщение vada »

Обратите внимание на модуль RTL.Math. В списке функций имеется ifthen( ), с помощью которой в FPC/Delphi ваша конструкция примет вид:


Ага. Шутку понял. Очень смешно.

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

var
  A,B: Integer;
  C: Real;
begin
  A := 1;
  B := 0;
  C := ifthen(B<>0,A/B,A);
end;
Timid
постоялец
Сообщения: 290
Зарегистрирован: 21.11.2007 20:33:15

Сообщение Timid »

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

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

if (x=1) {} 
вместо
if (x==1) {}


Вот пример для разбираемого случая:

Есть здесь ошибка? Синтаксически - нет.
Попробуйте так же наколоться с inc()

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

Сообщение alexs »

Ask писал(а): Си предназначен для системного программирования, в то время как Object Pascal -- для прикладного.

:lol: :lol: :lol:
Это за вас так решила фирма одна не бес-известная. Я думаю не надо объяснять почему они в своё время перевели свои окошки с паскаля не с?
Ask
Я не буду приводить вашу цитату. Просто очень часто за красивыми выкладками о удобстве, скорости и т.д. и т.п. скрывается обыкновенная человеческая лень и надежда на авось (авось не будет ошибок, авось все данные будут верными).
Я не спорю - С сокращает нажатие кнопок на клавишах. Но оправдана ли тут эта цель?
Можно тоже приводить кучу таких примеров - но тема превращается в холивар. Надо закругляться.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

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

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

Сообщение alexs »

Mr.Smart писал(а):все находятся в "анальном" рабстве упомянутой фирмы и это отрицают!

Хотелось бы, чтобы это было не так. Но финансовые вложения данной фирмы в продвижение своих продуктов таковы, что в нашей стране прочим компаниям честно конкурировать с ней просто без вариантов...
Мне очень бы хотелось в этом ошибаться, но слишком часто я с этим сталкиваюсь.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

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

alexs и не только в "нашей" стране :wink:
Ответить