Операторы в стиле C
Модератор: Модераторы
vada вот эта конструкция не помешала бы.
Ask писал(а):daesher писал(а):конструкции вида PByte(a)[3] вместо PByteArray(a)^[3]
Арифметика с указателями -- это, конечно, зло (хотя в последней версии сделали немного удобнее),
но в данном конкретном случае не вижу разницы -- range check что так, что этак бесполезен,
а визуально первый вариант даже приятнее.
Визуально он короче, но выглядит менее осмысленно. Вдумайтесь: третий элемент массива, который на самом деле не массив, а указатель на байт. Где здесь логика языка Паскаль? Я, конечно, понимаю, что в С так принято, но при чём здесь Паскаль? Думаю, такие вещи надо сопровождать Warning: poor Pascal code.
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
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) Меня вообще удивляют упорные попытки сравнивать (современный) Паскаль с Си. Такое ощущение, что аудиенция данного сайта обучалась программировать, когда Я обучался ходить
Object Pascal -- совершенно другой язык. Си предназначен для системного программирования, в то время как Object Pascal -- для прикладного. У этих языков практически нулевая область пересечения приложений (кроме, пожалуй, олимпиадных задач).
Лучшими сравнениями будет C#, как идеологический преемник, и Python, как идеологический аналог, хоть и интерпретируемый.
Мне тоже более понятны += чем inc(). Это дела вкуса
Тогда конструкции нужно переводить так
x := x+2 // К иксу прибавляем два и записываем в икс.
x += 2 // К иксу добавляем два.
Разницу подсветил. И то и то выражение в русском языке являются допустимыми. Почему же их аналогии на паскале должны быть не допустимы?
Т.е. максимально приближены к естественному языку
Тогда конструкции нужно переводить так
x := x+2 // К иксу прибавляем два и записываем в икс.
x += 2 // К иксу добавляем два.
Разницу подсветил. И то и то выражение в русском языке являются допустимыми. Почему же их аналогии на паскале должны быть не допустимы?
Думал не буду отвечать, но не сдержался 
alexs - получает +1 в башню.
Эээ вы это за правду.... операции вида += на самом деле раскрывают себя только в C++, при перегрузке операторов, спасая от создания копии аргумента и впринцыпе на этом все.
Теперь про теже указатели.
В паскале взятие адреса и разименоавние указателя даже обозночаются по разному (@, ^) тогда как в С только *.
Всегда привожу один и тот же пример сравнения адресов
Pascal
C
Не ну правда, зачем вы себя мучаете пишите на С, зачем портить себя и свой мозг .... и ..... Pascal-ем.
PS. Я благодарен разрабам за то что они не допустили такое в Free Pascal.
alexs - получает +1 в башню.
Мне тоже более понятны += чем inc().
Эээ вы это за правду.... операции вида += на самом деле раскрывают себя только в C++, при перегрузке операторов, спасая от создания копии аргумента и впринцыпе на этом все.
Теперь про теже указатели.
В паскале взятие адреса и разименоавние указателя даже обозночаются по разному (@, ^) тогда как в С только *.
Всегда привожу один и тот же пример сравнения адресов
Pascal
Код: Выделить всё
(@A and @B) C
Код: Выделить всё
(&A & &B) Не ну правда, зачем вы себя мучаете пишите на С, зачем портить себя и свой мозг .... и ..... Pascal-ем.
PS. Я благодарен разрабам за то что они не допустили такое в Free Pascal.
Не ну правда, зачем вы себя мучаете пишите на С, зачем портить себя и свой мозг .... и ..... Pascal-ем.
А не кто не мучается. Разрабам +1, что добавили такую возможность включать через директивы компилятора. Кому надо - пусть использует. Язык программирования должен быть для человека, а не наоборот.
-
eastorwest
- новенький
- Сообщения: 57
- Зарегистрирован: 23.07.2009 20:21:46
- Откуда: Н-ск
Обратите внимание на модуль RTL.Math. В списке функций имеется ifthen( ), с помощью которой в FPC/Delphi ваша конструкция примет вид:
Код: Выделить всё
a := ifthen(F,b,c);eastorwest принять то она примет, но отработают оба параметра b и c. http://freepascal.ru/forum/viewtopic.php?f=1&t=6228
Обратите внимание на модуль RTL.Math. В списке функций имеется ifthen( ), с помощью которой в FPC/Delphi ваша конструкция примет вид:
Ага. Шутку понял. Очень смешно.
Код: Выделить всё
var
A,B: Integer;
C: Real;
begin
A := 1;
B := 0;
C := ifthen(B<>0,A/B,A);
end;
Не понимаю, в самом деле, Вы не понимаете, что "стиль" Паскаля - защищать программиста от случайных ошибок кодинга.
Посмотрите сами, практически нет ни одной конструкции, которая содержала бы "случайную" логическую ошибку, вроде
Вот пример для разбираемого случая:
Есть здесь ошибка? Синтаксически - нет.
Попробуйте так же наколоться с inc()
PS.
Когда будете собирать проекты в сотни тысяч строк из кода десятка "недоделанных" проектов, поймете важность "случайных ошибок".
Посмотрите сами, практически нет ни одной конструкции, которая содержала бы "случайную" логическую ошибку, вроде
Код: Выделить всё
if (x=1) {}
вместо
if (x==1) {}
Вот пример для разбираемого случая:
Код: Выделить всё
x++=1
Есть здесь ошибка? Синтаксически - нет.
Попробуйте так же наколоться с inc()
PS.
Когда будете собирать проекты в сотни тысяч строк из кода десятка "недоделанных" проектов, поймете важность "случайных ошибок".
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
Ask писал(а): Си предназначен для системного программирования, в то время как Object Pascal -- для прикладного.
Это за вас так решила фирма одна не бес-известная. Я думаю не надо объяснять почему они в своё время перевели свои окошки с паскаля не с?
Ask
Я не буду приводить вашу цитату. Просто очень часто за красивыми выкладками о удобстве, скорости и т.д. и т.п. скрывается обыкновенная человеческая лень и надежда на авось (авось не будет ошибок, авось все данные будут верными).
Я не спорю - С сокращает нажатие кнопок на клавишах. Но оправдана ли тут эта цель?
Можно тоже приводить кучу таких примеров - но тема превращается в холивар. Надо закругляться.
alexs судя современной традиции, все находятся в "анальном" рабстве упомянутой фирмы и это отрицают!
это было лирическое отступление....
это было лирическое отступление....
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
Mr.Smart писал(а):все находятся в "анальном" рабстве упомянутой фирмы и это отрицают!
Хотелось бы, чтобы это было не так. Но финансовые вложения данной фирмы в продвижение своих продуктов таковы, что в нашей стране прочим компаниям честно конкурировать с ней просто без вариантов...
Мне очень бы хотелось в этом ошибаться, но слишком часто я с этим сталкиваюсь.
alexs и не только в "нашей" стране 
