Оберон-клуб «ВЄДАsoft»
https://zx.oberon.org/forum/

Дефект нотации: отсутствие THEN (THEN’у — быть!)
https://zx.oberon.org/forum/viewtopic.php?f=25&t=170
Страница 1 из 3

Автор:  Zorko [ 21 дек 2013, 13:41 ]
Заголовок сообщения:  Дефект нотации: отсутствие THEN (THEN’у — быть!)

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

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

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

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

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

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

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

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

Автор:  geniepro [ 21 дек 2013, 14:01 ]
Заголовок сообщения:  Re: Дефект нотации: отсутствие THEN (THEN’у — быть!)

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

Автор:  Zorko [ 21 дек 2013, 14:34 ]
Заголовок сообщения:  Re: Дефект нотации: отсутствие THEN (THEN’у — быть!)

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

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

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

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

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

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


Автор:  geniepro [ 21 дек 2013, 16:29 ]
Заголовок сообщения:  Re: Дефект нотации: отсутствие THEN (THEN’у — быть!)

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, <> в пользу птичьих закорючек ~, & и #.

Автор:  geniepro [ 21 дек 2013, 18:04 ]
Заголовок сообщения:  Re: Дефект нотации: отсутствие THEN (THEN’у — быть!)

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

Автор:  Zorko [ 21 дек 2013, 18:05 ]
Заголовок сообщения:  Re: Дефект нотации: отсутствие THEN (THEN’у — быть!)

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

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

Автор:  Saferoll [ 25 дек 2013, 18:51 ]
Заголовок сообщения:  Re: Дефект нотации: отсутствие THEN (THEN’у — быть!)

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

Автор:  Zorko [ 27 дек 2013, 14:45 ]
Заголовок сообщения:  Re: Дефект нотации: отсутствие THEN (THEN’у — быть!)

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

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

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

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

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

Автор:  Jordan [ 27 дек 2013, 17:55 ]
Заголовок сообщения:  Re: Дефект нотации: отсутствие THEN (THEN’у — быть!)

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


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

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

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

Автор:  Zorko [ 27 дек 2013, 17:59 ]
Заголовок сообщения:  Re: Дефект нотации: отсутствие THEN (THEN’у — быть!)

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

Страница 1 из 3 Часовой пояс: UTC + 2 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/