Оберон-клуб «ВЄДАsoft»

Твердыня модульных языков
Текущее время: 28 мар 2024, 11:25

Часовой пояс: UTC + 2 часа




Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу 1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: 21 дек 2013, 13:41 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Я знаю, среди программистов много сишников, которые начнут расхваливать семейство Си-подобных языков и втаптывать Паскаль в грязь, но давайте посмотрим на это с точки зрения адекватности нотации.

Условный оператор используется едва ли не чаще, чем другие операторы перехода управления. Если признать ценностью “Что думаю, то пишу; то читаю”, Паскаль- и даже Бейсик-нотация даёт гораздо больше преимуществ перед сишной в плане if:

“Если водка вечером, то рассол с утра!”

( Паскаль )
ЕСЛИ ВодкаВечером ТО РассолСУтра;
( Си, Java, C# )
если(водка_вечером)рассол_с_утра;

И здесь существенное THEN для отделения условия от того, что из него проистекает — гораздо более веская штука, чем какие-то сомнительные сишные скобки. Сильно облегчает восприятие программы. Я заметил, что когда читаю сишную программу, приходится ставить ТО в уме, т.е. распаковка. При чтение Паскаль-программ таких распаковок гораздо меньше, восприятие лучше, мозг не так засорён всякой ерундой, остаётся больше ресурсов на действительно важные вещи.

THEN и ELSE это парные операторы. Их называют “ветка то” и “ветка иначе”. Опусканию ключевого слова, предшествующего “ветке то” нет никакого оправдания, это нарушает симметричность. Ну можно конечно оправдать. Многословность и всё такое. Маленькие экраны. Долго набирать. Но скобки сишные? Они там обязательны. Зачем так замусоривать исходник лишними скобками? Их не долго набирать? А я знаю зачем. Так парсер было удобнее делать. Проще. :)

( Форт )
?ВодкаВечером ЕСЛИ РассолСУтра ТО
( Хаскел )
Напишите сами. Возможно, ?(ВодкаВечером):(РассолСУтра) ?

Ну в общем, короче и со скобками, с другими матючками — можно, яснее нельзя. Паскаль рулит.


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 21 дек 2013, 14:01 
Не в сети

Сообщения: 203
Zorko писал(а):
( Хаскел )
Напишите сами. Возможно, ?(ВодкаВечером):(РассолСУтра) ?

Конкретно в Хаскелле у конструкции if должен быть не только then, но и else:

if водкаВечером then рассолСУтра else чайМожетБыть

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

fact n = if n==0 then 1 else n*fact(n-1)

но чаще делают так:

fact 0 = 1
fact n = n*fact(n-1)

хотя конкретно в данном случае проще сделать так:

fact n = product [1..n]

PS. Вообще, не стоит наезжать прямо уж на всех сишниов под одну гребёнку. Ну да, я чаще использую С# и С++, чем Паскаль и тот же Хаскель, но я же не втаптываю Паскаль в грязь.
Или для тебя любая критика -- это втаптывание в грязь? Но тогда ты куда более злобен чем любой сишник...


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 21 дек 2013, 14:34 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Не имел ввиду конкретно тебя.
Не вижу связи между неприятием критики и злобностью.
И пойми: если уж человек для себя что-то выстрадал и понял, он имеет право утверждать свои ценности.

Твоё наслаждение красотами системы типов Хаскела и скоростью разработки на шарпе не в счёт, это не страдания. ;)

Моя реакция же вызвана тем, что ты навязываешь мне Хаскел. Хотя он мне не подходит и не нужен. И, видимо, не только мне, раз тебя прозвали на оберспейсе "хаскел-бой". ;) Но я понимаю: ты так самоутверждаешься.

Если я пойду на форумы по Хаскелу навязывать им Оберон, я буду ровной в той же роли, что и ты здесь. И могу не удивляться реакции, которую там вызову.

P.S. Значит в Хаскеле else обязательное? Это ещё что за изврат? ;) А если не надо? Всё равно пользуй? ;)

P.P.S. Я могу продолжить критику уже сего рулезного "==", но это всё ж уже блин и так расписано по самое небалуйся:



Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 21 дек 2013, 16:29 
Не в сети

Сообщения: 203
Zorko писал(а):
Моя реакция же вызвана тем, что ты навязываешь мне Хаскел. Хотя он мне не подходит и не нужен.
Я навязываю? о_О Да если и навязываю, то не больше чем ты навязываешь обероны и родноверие...

Zorko писал(а):
И, видимо, не только мне, раз тебя прозвали на оберспейсе "хаскел-бой". ;)
Это кто же меня так "прозвали"? Некий неадекват по имени Пётр Кузьмицкий? Кто ещё?

Zorko писал(а):
Но я понимаю: ты так самоутверждаешься.
О, да ты психолог. Не думал сменить род занятий? )))

Zorko писал(а):
Если я пойду на форумы по Хаскелу навязывать им Оберон, я буду ровной в той же роли, что и ты здесь. И могу не удивляться реакции, которую там вызову.
Хаскеллеры в этом плане куда толерантнее оберонщиков, так что особой реакции ты там не вызовешь, имхо.

Zorko писал(а):
P.S. Значит в Хаскеле else обязательное? Это ещё что за изврат? ;) А если не надо? Всё равно пользуй? ;)
Это не изврат. Просто в Хаскелле нет операторов, соответственно нет и оператора if-then.
А если нет операторов, а всё является выражением, то и if-then-else тоже является выражением, и, как и всякое выражение, должно вернуть результат, причём в выражении if-then-else возвращается один из двух результатов, оба из которых должны иметь один и тот же тип.
В этом плане по семантике хаскельное if-then-else похоже на сишную тернарную операцию ?:

Если тебе вдруг не надо выполнять альтернативное действие в операторе IF (то есть часть ELSE не нужна), значит речь идёт об императивных действиях ввода/вывода или изменения состояния.
Конкретно в хаскелле, подобные вещи тоже могут быть нужны в тех частях программы, что ответственны за действия вввода/вывода. В этом случае используются предопределённые в стандартной библиотеке функции when и unless, и этот код будет выглядеть примерно так:

when водкаВечером $ do рассолСУтра

Zorko писал(а):
P.P.S. Я могу продолжить критику уже сего рулезного "==", но это всё ж уже блин и так расписано по самое небалуйся.
Не путай си и хаскель. В сях ты можешь изменить содержимое переменной внутри проверки условия, в хаскелле это невозможно -- система типов не позволит. Мне тоже не особо нравится "==", но чем его заменить тогда? Ведь символ "=" занят под объявление констант, функций, типов. Вот и пришлось использовать знак "==", который благодаря сишным языкам весьма известен.
Точно так же мне не нравятся операции &&, ||, и мне непонятно, почему Вирт в Оберонах и Модуле-2 ушёл от операций NOT, AND, <> в пользу птичьих закорючек ~, & и #.


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 21 дек 2013, 18:04 
Не в сети

Сообщения: 203
geniepro писал(а):
Некий неадекват по имени Пётр Кузьмицкий?
Пардон. У Петрухи фамилия Кушнир...


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 21 дек 2013, 18:05 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
ИМХО
1. Для краткости
2. Потому что & заменяет AND уже давно, это мировая практика
3. Лучше символа # в ASCII для обозначения "не равно" всё равно ничего нет. Куда понятнее, чем корявое != или <>
4. ~ ? Йоу, ты же математик! ;)

P.S. Оч-чень адекватно он тебя прозвал. ;)


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 25 дек 2013, 18:51 
Не в сети
Администратор
Аватара пользователя

Сообщения: 273
Откуда: Россия
geniepro писал(а):
...и мне непонятно, почему Вирт в Оберонах и Модуле-2 ушёл от операций NOT, AND, <> в пользу птичьих закорючек ~, & и #.

Zorko писал(а):
ИМХО 1. Для краткости 2. Потому что & заменяет AND уже давно, это мировая практика
Вирт не стремится экономить буквы, наоборот - не стесняется использовать целые слова там, где казалось бы и вовсе никакие значки не нужны.
Мне кажется использование ~ и & вместо слов сделано не ради краткости, а для наглядности. Значки занимают меньше места, а значит их операнды стоят ближе друг к другу. Это лучше передает структуру выражения - операции выполняющиеся в первую очередь стоят плотнее, слитнее. С этой же целью,например, в математике принято, опускать знак умножения: "АВ + СD" - это есть сумма двух произведений. Т.е. операции с большим приоритетом должны "стягивать", а с меньшим "давать разрядку". NOT и AND имеют больший приоритет чем OR, поэтому они обозначаются значками.
Условие
Код: "OBERON"
  1. (x>0)&(A[i]>B[j]) OR (x=0)&(A[i]=0) OR (x<0)&(B[j]=0)
даже записанное в одну строчку, выражает структуру "условие состоит из 3-х случаев", потому что OR больше бросается в глаза, чем значок &.

Что же касается знака "не равно"... В обычном наборе ASCII нет знака ≠ ("перечёркнутое равенство"), поэтому приходится его изображать либо логически ( "<>" -"меньше или больше", "~=" - "отрицание равенства"), либо по сходству начертания ("!=", "/=", "#"). Мне лично больше нравится "/=" (такое обозначение было в Рапире :) ). Знак "#" тоже достаточно нагляден, да и "!=" для меня не выглядит таким уж "корявым". Это уже дело вкуса и привычки.


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 27 дек 2013, 14:45 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
На самом деле "<>" хорошо обозначает "меньше или больше", но приводить "меньше или больше" в уме в "не равно" всё-таки приходится, так мы обучены думать. К тому же неравенство не обязательно обозначает "меньше или больше", например, в случае сравнения логической (BOOLEAN) или символьной (CHAR) информации (и мне кажется, Вирт хотел ослабить привязку символов к тому факту, что они представлены кодами в таблице и их можно сравнивать на больше-меньше; оно бы и неплохо для упорядочения по алфавиту, но вспомните насколько далеко отстоит от остальных, например, в кодовой таблице 1251 буква "Ё", так что простым сравнением кодов тут не обойтись).

Ещё у меня претензия к "<>" в том, что иногда, запомнив только общую логику "меньше или больше", индивид непременно попытается записать его в виде "><", что, строго говоря, обозначает ровно то же. Как быть? Разрешить в нотации оба вида записи? Правильно, будет бардак.

"#" имеет преимущество перед "/=" в том, что перечёркивание равности параллельных прямых хоть и двойное, но всё-таки обозначено, а в "/=" его приходится "додумывать", сдвигая "/" вправо ровно на "=". Так что дядька Вирт опять не прогадал. Остаётся только удивиться, почему же символ "#" не использовали для обозначения неравенства раньше, в других языках до Оберона.

Насколько обосновано было придерживаться именно набора символов ASCII? Да вот, ЯП это достаточно консервативная область. Текстовые исходники так накрепко завоевали уважение программистов, обросли системами контроля версий, утилитами для автоматической обработки, сравнения, слияния и т.д., что полный набор символов для обозначения программных единиц вызовет большую волну недовольства, бардака с кодировками, форматами исходников и т.п. Мы с вами знаем чем закончилась эта попытка в языке APL. И хотя я с интересом посмотрел на Fortress, где можно прямо записывать формулы в том виде, в котором они в учебнике математики, но как это скрестить со своей практикой — я не придумал.

Может показаться, что мы спорим о пустяках и на пустом месте. Ну что там, дескать, скобочка такая или скобочка этакая, но нет, неудачная нотация может очень серьёзно затруднить восприятие программы "с листа". Оберон в этом смысле прекрасно уточнён. Взять лишние скобки в программах на Си-подобных языках. Чем реально оправдать их наличие в if(), for(), switch(), while(), кроме как упрощением парсера? Ну да это уже ладно, но зачем употреблять скобки при вызове функций без параметров? Уже по способу применения можно отличить функцию от переменной во всех случаях, кроме когда функция без параметров возвращает результат. Вот здесь и только здесь в Обероне пишутся скобки:
Код: "OBERON"
  1. a := var; (* переменная *)
  2. a := func(); (* функция *)


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 27 дек 2013, 17:55 
Не в сети

Сообщения: 53
Откуда: Россия, Самара
Zorko писал(а):
( Паскаль )
ЕСЛИ ВодкаВечером ТО РассолСУтра;
( Си, Java, C# )
если(водка_вечером)рассол_с_утра;


От THEN можно отказаться безболезненно, введя правило в язык

IF "condition"
"statement" всегда на новой строке

Тогда можно отказаться от THEN и DO


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 27 дек 2013, 17:59 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
А else куда же? И сейчас никто не мешает писать на Си:
Код: "C"
if(a)
b();
else
c();
 
Но всё-равно без THEN как-то не так воспринимается. Возможно, дело привычки.


Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 2 часа


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
© VEDAsoft Oberon Club