OberonCore https://forum.oberoncore.ru/ |
|
точки с запятой https://forum.oberoncore.ru/viewtopic.php?f=86&t=6798 |
Страница 2 из 2 |
Автор: | Sergej Durmanov [ Пятница, 20 Август, 2021 02:59 ] |
Заголовок сообщения: | Re: точки с запятой |
Цитата: Для АО вроде C# был ориентиром. Active Oberon появился раньше C#.
|
Автор: | Oleg N. Cher [ Пятница, 20 Август, 2021 09:08 ] |
Заголовок сообщения: | Re: точки с запятой |
Rifat писал(а): Вот, кстати, пример ошибочного кода (при отсутствии точек с запятой): А неважно где ошибка. Это ведь всё равно синтаксическая ошибка, которую заметит компилятор, а программист исправит. Вы лучше дайте пример, где убирание ";" приведёт к изменению логики работы программы, оставляя её синтаксически правильной.a := b := c Где ошибка? После первого присваивания забыли что-то дописать? Или же у второго присваивания пропустили то, чему присваиваем. budden писал(а): Ну и как бы, если даже это и работает, всё равно, живёт то решение, которое принимают другие. Чтобы это произошло, нужно ещё иногда идти на компромиссы. Денис, живой пример: поддержка нижнего регистра для ключевых слов в Обероне-3, о которой попросил один человек. Я сам не вижу очень много смысла в этом, но пошёл ему навстречу, теперь эта возможность есть. Компромисс. Но - для тех, кто заинтересован и пользуется. А набежать с криками "Ты зачем это сделал? Ты зачем это сделал именно так? А вот тут написано, что это не сработает, и довольно авторитетно написано". Всё это как-то не вдохновляет.Я сделал вот так с лоукейсами, чтобы уж нижний регистр, так нижний. А не вперемешку, как можно в Паскале. Мне так показалось более правильным. И с ";" я тоже сделал так, как мне кажется более правильным, т.е. не плодить неявных ";" в конце каждой строки, что вынуждает вводить в язык какой-то "продолжатель строки" типа \ budden писал(а): Вы же делаете для себя и прямо с каким-то вызовом. Ну делайте, ок. Тогда можно вообще не выходить на форум, если вы делаете для собственного удовольствия и признания не ищете. Не нравится - не пользуемся. У нас тут сообщество свободных программистов, и каждый делает что считает нужным. И у меня больше моральных прав на публикацию новостей об Ofront+, чем у Вас о плодах Вашей деятельности, Денис, т.к. Вы позиционируете себя не оберонщиком, пытаетесь натянуть сову на глобус, т.е. свои лисперно-мэйнстримно-русскоязычные взгляды на Оберон-технологии, и вообще делаете вид, что собираетесь осчастливить человечество, по крайней мере, его русскоязычную часть. У меня хватает скромности оценить масштабы моей деятельности умеренно. Вы же идёте дальше, Вы ратуете за судьбу России и в этом контексте чего-то помаленьку допиливаете в A2 на свой лад, что, насколько я понимаю, не интересует даже любителей A2, которые на этих допилах давно собаку съели. Я не вижу здесь связи. Но Вашей, Денис, масштабности замыслов не хватает вложений в Вас. Вы никого не смогли увлечь своими идеями, а уж тем более под финансирование. Так что тут ещё вопрос, кто из нас больше прямо с каким-то вызовом - я или Вы.Признайте, что Вы не практик, Денис. Вы теоретик. Может и неплохой, может в каком-нить ETH и смогли бы чего-то добиться, но не в условиях современной Россиюшки. Я могу и дальше развить эту тему, но Вам не понравится, так что не провоцируйте. budden писал(а): Сделай там оператор-выражение, как в любом популярном на сегодня языке - и всё, сломаются ваши точки с запятой. А это Oberon-way?budden писал(а): Если у вас спектрум, то у него маленькие программы. Оберон-07 подходит для них, особенно, если компилятор должен поместиться на сам спектрум. Имею возразить: Оберон-07 довольно плохой язык для Спектрума. И вообще для восьмибиток. Сообщество его не примет. Там идеальный язык будет даже не Си, а какой-нибудь PL/M или Cowgol, потому что эти языки заточены под восьмибитки, а их компиляторы в состоянии создать код приемлемого качества. Но по опыту скажу, что пользоваться ими для разработки под Спектрум никто всё равно не будет, т.е. у них будет градус 0, а у Оберона - минус один. Выше нуля же будет только ассемблер.А уж помещать компилятор О7 прямо в Спектрум это вообще дурная затея, не Форт чай. |
Автор: | budden [ Пятница, 20 Август, 2021 10:08 ] |
Заголовок сообщения: | Re: точки с запятой |
Олег, я привык к хамству в интернете, и к тому, что люди дают произвольные оценки моей личности. Но я не уважаю тех, кто так делает. Надеюсь, у Вас хватит смелости мне это повторить в лицо? |
Автор: | budden [ Пятница, 20 Август, 2021 10:10 ] |
Заголовок сообщения: | Re: точки с запятой |
Sergej Durmanov писал(а): Active Oberon появился раньше C#. А как же фронтэнд для C#? Потом сделали? Ну не суть, достаточно и примера с ББ. Да и вообще, полно примеров, когда мода влияет на решения. Сейчас ещё скажете, что режим Lax появился раньше Go, но это неважно, он всё равно не фонтан, и тот пример, что пришлось менять грамматику, чтобы не возникало неоднозначностей, на это намекает. |
Автор: | Oleg N. Cher [ Пятница, 20 Август, 2021 10:13 ] |
Заголовок сообщения: | Re: точки с запятой |
budden писал(а): Олег, я привык к хамству в интернете, и к тому, что люди дают произвольные оценки моей личности. Но я не уважаю тех, кто так делает. Надеюсь, у Вас хватит смелости мне это повторить в лицо? Какое хамство, Денис? Пока это только оценка Вашей деятельности на форуме. И чего я там должен повторить в лицо? Сказать Вам о том, что меня не радует Ваша деятельность и я считаю её засоряющей форум? Могу конечно.
|
Автор: | Борис Рюмшин [ Пятница, 20 Август, 2021 10:26 ] |
Заголовок сообщения: | Re: точки с запятой |
budden писал(а): Ну в общем-то вопрос про точки с запятой - гораздо более мелкий, чем система типов. Если уж в типах поступились гордостью, то можно и в этом вопросе поступиться. budden писал(а): Ну не суть, достаточно и примера с ББ. Да и вообще, полно примеров, когда мода влияет на решения. Какая мода? Какая гордость? Там вполне конкретная техническая задача решалась (в коммерческой фирме, отмечу) -- совместная работа Явы и КП в рамках Jbed. |
Автор: | Борис Рюмшин [ Пятница, 20 Август, 2021 10:27 ] |
Заголовок сообщения: | Re: точки с запятой |
Олег, Денис. Идите выяснять отношения в ЛС, пожалуйста, сразу. |
Автор: | budden [ Пятница, 20 Август, 2021 10:47 ] |
Заголовок сообщения: | Re: точки с запятой |
Борис Рюмшин писал(а): budden писал(а): Ну в общем-то вопрос про точки с запятой - гораздо более мелкий, чем система типов. Если уж в типах поступились гордостью, то можно и в этом вопросе поступиться. budden писал(а): Ну не суть, достаточно и примера с ББ. Да и вообще, полно примеров, когда мода влияет на решения. Какая мода? Какая гордость? Там вполне конкретная техническая задача решалась (в коммерческой фирме, отмечу) -- совместная работа Явы и КП в рамках Jbed. Гордость - это, может быть и фигура речи, а мода точно при деле. Ведь решалась же техническая задача совместной работы Явы и КП, а не Кобола и КП. А почему? Потому что возникла мода на Яву. Если вернуться к точкам с запятой, то оказывается, что Олег идёт в мейнстриме того, что делается в рамках Оберона, хотя этот мейнстрим, в своё очередь, находится не в мейнстриме того, что делается в других ЯП. Хотя мейнстримом из ЯП является JS, где это сделано ещё намного хуже. Надо всё же понять правило для Go, займусь этим. |
Автор: | budden [ Пятница, 20 Август, 2021 11:34 ] |
Заголовок сообщения: | Re: точки с запятой |
Итак. согласно спецификации точка с запятой в Го обязательна и вставляется в конце строки после: Цитата: - an identifier - an integer, floating-point, imaginary, rune, or string literal - one of the keywords break, continue, fallthrough, or return - one of the operators and punctuation ++, --, ), ], or } А что остаётся от лексем? Цитата: identifiers, keywords, operators and punctuation, and literals Какие есть литералы, кроме тех, после которых вставляется? Composite Literal и Function Literal. Код: CompositeLit = LiteralType LiteralValue . LiteralType = StructType | ArrayType | "[" "..." "]" ElementType | SliceType | MapType | TypeName . LiteralValue = "{" [ ElementList [ "," ] ] "}" . Код: FunctionLit = "func" Signature FunctionBody . FunctionBody = Block . Block = "{" StatementList "}" Оба литерала завершаются фигурной скобкой. Значит, после любых литералов вставляется. Ключевые слова какие остались? Код: -break default func interface select case defer go map struct chan else goto package switch const -fallthrough if range type -continue for import -return var Минусом я пометил ключевые слова, после которых вставляется точка с запятой. Как видим, здесь получается сложное правило, которое было мнемонически сформулировано как "если ключевое слово может завершать предписание (я называю statement-ы предписаниями, чтобы не путать операторы с операциями - такая путаница пришла к нам из английского) , то за ним вставляется точка с запятой". И тут мы приходим к неприятному для меня моменту: по моему правилу нельзя написать на отдельной строчке слово var, type или const а в go это можно. Кажется, получается, что сложность правила в голанге оправдана в этом моменте. Теперь операции: Код: Expression = UnaryExpr | Expression binary_op Expression . UnaryExpr = PrimaryExpr | unary_op UnaryExpr . binary_op = "||" | "&&" | rel_op | add_op | mul_op . rel_op = "==" | "!=" | "<" | "<=" | ">" | ">=" . add_op = "+" | "-" | "|" | "^" . mul_op = "*" | "/" | "%" | "<<" | ">>" | "&" | "&^" . unary_op = "+" | "-" | "!" | "^" | "*" | "&" | "<-" . Ребята из го, у вас странная спецификация, ++ и -- - это не операции, а предписания. Но лексемы ++ и -- находятся в категории "операции и знаков препинания", забавно. Код: + & += &= && == != ( ) - | -= |= || < <= [ ] * ^ *= ^= <- > >= { } / << /= <<= ++ = := , ; % >> %= >>= -- ! ... . : &^ &^= Раз у вас ++ и -- - не операции, значит они знаки препинания, что ли? Несмотря на этот терминологический косяк, вот определение предписаний инкремента и декремента. Код: IncDecStmt = Expression ( "++" | "--" ) . Знаки ++ и -- могут стоять только после выражения, а не до (вот кстати типичный путь Оберона). Тоже вроде логично - если у нас есть бинарная операция, то мы ставим её в конце строчки и это означает, что „продолжение следует“. Поскольку создатели языка стремились к тому, чтобы язык читался слева направо (молодцы), у них все унарные операции являются префиксными, а ++ и -- они огородили, сделав их предписаниями. А теперь, соответственно, домашнее задание: можно ли моё правило починить так, чтобы оно было не хуже голанга. Цель тут - сделать правило более простое и понятное. Моё правило в последней редакции звучит как-то так: Код: - точка с запятой обязательна даже перед end - пустой оператор запрещён - точка с запятой вставляется в конце строки, кроме случая открывающих скобок - вместо продолжения строки строка делается длинной, а среда разработки должна её переносить В общем, сразу видны проблемы: Код: PROCEDURE P() BEGIN m := a + b + c + d + e END P Из-за слишком интенсивной вставки точек с запятой весь код норовит залезть на одну строчку. Чтобы это поправить, придётся вводить список ключевых слов, приравненных к открывающим скобкам, и включить туда хотя бы BEGIN. Скорее получается, что нужно ввести понятие "открывающего слова", которое как бы скобка, а закрывается оно точкой с запятой. И сказать, что после открывающих слов точка с запятой не вставляется. Получится то же, что в go, но вместо перечисления большого списка ключевых слов, которые непонятно по какому принципу отобраны, мы назовём одно понятие. Кстати, о птичках - голанг - это не очень сильно переделанный активный оберон (и плюс заимствования из языков, о которых я ничего не знаю, поэтому и не могу увидеть этих заимствований). Но там ради моды приделали фигурные скобочки. Это к вопросу о моде. |
Автор: | budden [ Пятница, 20 Август, 2021 11:36 ] |
Заголовок сообщения: | Re: точки с запятой |
И кстати, если это правило заменить на просто "точки с запятой необязательны", то грамматика останется однозначной. Верно я говорю или нет? Похоже, что вообще говоря - нет, но с учётом того, что значение выражения должно быть использовано - похоже, что да. Надо потом доразобраться. Я начал с того, что радостно набил в go playground пример Код: package main import ("fmt") func main() { a := 1 b := a; -a fmt.Println(b) } но получил "./prog.go:6:2: -a evaluated but not used" |
Автор: | budden [ Пятница, 20 Август, 2021 13:11 ] |
Заголовок сообщения: | Re: точки с запятой |
Цитата: Относительно оберонов - просто по идеологии их построения, НЕ ДОЛЖНО появляться даже намёка на мысль о "необязательности" какого-то элемента синтаксиса. Он - либо обязательно ставится в данном месте, либо, никто даже не заикается о возможности его появления здесь. Влад, это Ваше представление об Обероне. На самом деле в Оберонах прежде всего важно то, что сказал Вирт. Я тоже попал в эту логическую ловушку. Не забываем, что Оберон - это учебный язык (для обучения и программировани, и созданию компиляторов), или язык оптимизированный под минимальную трудоёмкость создания, с элементами вкусовщины. Его черты не выводятся из каких-то общих принципов. А потом его для чего-то полезного тоже применили, он стал ветвиться и т.п. |
Автор: | Sergej Durmanov [ Суббота, 21 Август, 2021 11:12 ] |
Заголовок сообщения: | Re: точки с запятой |
Цитата: А как же фронтэнд для C#? Это не настоящий C#))) Это Активный Оберон с пошарпанным синтаксисом. Насколько я помню, это было сделано для проекта Staila. Это ОС основанная на идеях A2. Пишем код на нормальном языке ( Active Oberon ) и транслируем в C. Для поклонников Си - фронтэнд со скобочками вместо begin end; Для компилятора Fox есть траспилятор в Си, который как раз поддерживает Staila OS https://web.archive.org/web/20120512225 ... m/stailaos . Цитата: Сейчас ещё скажете, что режим Lax появился раньше Go это режим для REPL, в котором разделители ; не сильно нужны. Также для этого полезны и объявления переменных по месту ( declaration statement ), автовывод типа и другие вещи, которые ввели в язык. Цитата: и тот пример, что пришлось менять грамматику, чтобы не возникало неоднозначностей Здесь всё просто. Тип ANY - это просто указатель и переменные этого типа могут принимать любые значения ссылочного типа: object, pointer to record, pointer to array. И это проблема. Поэтому ввели такой же обобщенный тип object - var o: object; , который тоже указатель, но даёт нам гарантии, что в переменной находятся объекты. Гарантии это хорошо. Но это внесло неоднозначность и в режиме Lax всё же приходилось ставить разделитель в этих местах. Сейчас эту проблему исправили и сделали синтаксис чище. |
Автор: | budden [ Суббота, 21 Август, 2021 12:37 ] |
Заголовок сообщения: | Re: точки с запятой |
Сергей, спасибо за пояснения! Цитата: это режим для REPL, в котором разделители ; не сильно нужны. Сказать точнее - это режим, в котором каждому придёт в голову, что в bash их нет. Вот кстати в VxWorks есть подобное Код: Execute C statements. -> test = malloc(100); test[0] = 10; test[1] = test[0] + 2 -> printf("Hello!") Цитата: Также для этого полезны и объявления переменных по месту ( declaration statement ), автовывод типа и другие вещи, которые ввели в язык. Да они и сами по себе полезны, без REPL. Или сами по себе вредны. |
Автор: | budden [ Суббота, 21 Август, 2021 23:51 ] |
Заголовок сообщения: | Re: точки с запятой |
Интересно, а если сделать так: Код: * точка с запятой обязательна * но там, где она ожидается, за неё может сойти и конец строки * там, где точка с запятой не ожидается, конец строки равен пробелу В этом случае a := b b := a будет синтаксической ошибкой, а Код: begin end - не будет. При этом всё же правило проще, чем в go. Пока не думал над этим всерьёз. Хотя, если хотим однозначности, то нужно сказать, что если ожидается конец оператора, то им может быть или точка с запятой, или конец строки, но не оба. Т.е. если точка с запятой в конце строки не нужна, то она и запрещена. В этом случае Код: a := b; (* ошибка *)
b := a a := b; b := a (* норм *) a := b (* норм *) b := a |
Автор: | budden [ Четверг, 09 Сентябрь, 2021 15:54 ] |
Заголовок сообщения: | Re: точки с запятой |
В ШАЯ правила тоже не слишком простые: точка с запятой подразумевается в конце строки, а также вставляются "неявные переносы строк": Цитата: перед словами все, кц, кц_при; после слов нач, выбор, нц (только в случае цикла нц-кц), раз; перед и после слов то, иначе, при; перед словом при и после двоеточия в при-строке. Возможности отменить действие конца строки я не углядываю, причём, формулировки тоже достаточно мутные. Пообщался с педагогом на тему необязательности точек с запятой - он сказал, что это плохо для школьников. Точки с запятой делают ситуацию предельно ясной. Да, профессионалов они могут раздражать. Так и получается, что бывают разные языки для разных применений и к одному идеалу они несводимы (впрочем, это и раньше было ясно). Итого, я вижу только два варианта, которые я называл бы простыми:
Тут мне придётся снять шляпу перед Виртом. Хотя... необязательность точек с запятой перед END ставит под сомнение простоту этого варианта. Нет, похожу в шляпе пока что. |
Автор: | Иван Денисов [ Четверг, 16 Сентябрь, 2021 12:21 ] |
Заголовок сообщения: | Re: точки с запятой |
Точка с запятой чаще всего не ставится, если оператор записан в одну строку IF var THEN Do1 ELSE Do2 END; Тут точки с запятой были бы синтаксическим мусором... В следующем случае предпочтительно использовать точки с запятой, так как могут добавиться строки после вызова Do1, и тогда придётся менять строку помимо добавленной... И в разных дифах - это уже будет выглядеть не очень симпатично. IF var THEN Do1; ELSE Do2; END; В таких многострочных конструкциях тоже раньше удалял точки с запятой, хотя Фёдор Васильевич рекомендовал в своих руководствах ставить тут точку с запятой, из вышеописанных соображений. И я теперь склоняюсь к тому, что это разумные рассуждения. |
Автор: | budden [ Понедельник, 20 Сентябрь, 2021 09:43 ] |
Заголовок сообщения: | Re: точки с запятой |
В этой теме речь идёт не о том, как ставить точки с запятой в существующем Обероне, а о том, как ослабить эти правила. Выяснилось, что точки с запятой из грамматики можно вообще выкинуть и при этом грамматика останется однозначной, хотя расстояние до ошибки уменьшится. Также выяснилось, что этот режим применён не позднее, чем в A2 (режим Lax), и добавились ещё применения. Также здесь сравниваются различные варианты, как обходиться с точками с запятой, если делать их ещё более необязательными, чем они есть сейчас. |
Страница 2 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |