OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Понедельник, 20 Сентябрь, 2021 21:34

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




Начать новую тему Ответить на тему  [ Сообщений: 37 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: точки с запятой
СообщениеДобавлено: Пятница, 20 Август, 2021 02:59 

Зарегистрирован: Пятница, 11 Январь, 2019 19:26
Сообщения: 247
Откуда: Russia
Цитата:
Для АО вроде C# был ориентиром.
Active Oberon появился раньше C#.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: точки с запятой
СообщениеДобавлено: Пятница, 20 Август, 2021 09:08 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 461
Откуда: Украина, Днепропетровская обл.
Rifat писал(а):
Вот, кстати, пример ошибочного кода (при отсутствии точек с запятой):
a := b := c
Где ошибка? После первого присваивания забыли что-то дописать? Или же у второго присваивания пропустили то, чему присваиваем.
А неважно где ошибка. Это ведь всё равно синтаксическая ошибка, которую заметит компилятор, а программист исправит. Вы лучше дайте пример, где убирание ";" приведёт к изменению логики работы программы, оставляя её синтаксически правильной.

budden писал(а):
Ну и как бы, если даже это и работает, всё равно, живёт то решение, которое принимают другие. Чтобы это произошло, нужно ещё иногда идти на компромиссы.
Денис, живой пример: поддержка нижнего регистра для ключевых слов в Обероне-3, о которой попросил один человек. Я сам не вижу очень много смысла в этом, но пошёл ему навстречу, теперь эта возможность есть. Компромисс. Но - для тех, кто заинтересован и пользуется. А набежать с криками "Ты зачем это сделал? Ты зачем это сделал именно так? А вот тут написано, что это не сработает, и довольно авторитетно написано". Всё это как-то не вдохновляет.

Я сделал вот так с лоукейсами, чтобы уж нижний регистр, так нижний. А не вперемешку, как можно в Паскале. Мне так показалось более правильным.

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

budden писал(а):
Вы же делаете для себя и прямо с каким-то вызовом. Ну делайте, ок. Тогда можно вообще не выходить на форум, если вы делаете для собственного удовольствия и признания не ищете.
Не нравится - не пользуемся. У нас тут сообщество свободных программистов, и каждый делает что считает нужным. И у меня больше моральных прав на публикацию новостей об Ofront+, чем у Вас о плодах Вашей деятельности, Денис, т.к. Вы позиционируете себя не оберонщиком, пытаетесь натянуть сову на глобус, т.е. свои лисперно-мэйнстримно-русскоязычные взгляды на Оберон-технологии, и вообще делаете вид, что собираетесь осчастливить человечество, по крайней мере, его русскоязычную часть. У меня хватает скромности оценить масштабы моей деятельности умеренно. Вы же идёте дальше, Вы ратуете за судьбу России и в этом контексте чего-то помаленьку допиливаете в A2 на свой лад, что, насколько я понимаю, не интересует даже любителей A2, которые на этих допилах давно собаку съели. Я не вижу здесь связи. Но Вашей, Денис, масштабности замыслов не хватает вложений в Вас. Вы никого не смогли увлечь своими идеями, а уж тем более под финансирование. Так что тут ещё вопрос, кто из нас больше прямо с каким-то вызовом - я или Вы.

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

budden писал(а):
Сделай там оператор-выражение, как в любом популярном на сегодня языке - и всё, сломаются ваши точки с запятой.
А это Oberon-way?

budden писал(а):
Если у вас спектрум, то у него маленькие программы. Оберон-07 подходит для них, особенно, если компилятор должен поместиться на сам спектрум.
Имею возразить: Оберон-07 довольно плохой язык для Спектрума. И вообще для восьмибиток. Сообщество его не примет. Там идеальный язык будет даже не Си, а какой-нибудь PL/M или Cowgol, потому что эти языки заточены под восьмибитки, а их компиляторы в состоянии создать код приемлемого качества. Но по опыту скажу, что пользоваться ими для разработки под Спектрум никто всё равно не будет, т.е. у них будет градус 0, а у Оберона - минус один. Выше нуля же будет только ассемблер.

А уж помещать компилятор О7 прямо в Спектрум это вообще дурная затея, не Форт чай.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: точки с запятой
СообщениеДобавлено: Пятница, 20 Август, 2021 10:08 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1344
Олег, я привык к хамству в интернете, и к тому, что люди дают произвольные оценки моей личности. Но я не уважаю тех, кто так делает. Надеюсь, у Вас хватит смелости мне это повторить в лицо?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: точки с запятой
СообщениеДобавлено: Пятница, 20 Август, 2021 10:10 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1344
Sergej Durmanov писал(а):
Active Oberon появился раньше C#.

А как же фронтэнд для C#? Потом сделали? Ну не суть, достаточно и примера с ББ. Да и вообще, полно примеров, когда мода влияет на решения. Сейчас ещё скажете, что режим Lax появился раньше Go, но это неважно, он всё равно не фонтан, и тот пример, что пришлось менять грамматику, чтобы не возникало неоднозначностей, на это намекает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: точки с запятой
СообщениеДобавлено: Пятница, 20 Август, 2021 10:13 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 461
Откуда: Украина, Днепропетровская обл.
budden писал(а):
Олег, я привык к хамству в интернете, и к тому, что люди дают произвольные оценки моей личности. Но я не уважаю тех, кто так делает. Надеюсь, у Вас хватит смелости мне это повторить в лицо?
Какое хамство, Денис? Пока это только оценка Вашей деятельности на форуме. И чего я там должен повторить в лицо? Сказать Вам о том, что меня не радует Ваша деятельность и я считаю её засоряющей форум? Могу конечно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: точки с запятой
СообщениеДобавлено: Пятница, 20 Август, 2021 10:26 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4546
Откуда: Россия, Орёл
budden писал(а):
Ну в общем-то вопрос про точки с запятой - гораздо более мелкий, чем система типов. Если уж в типах поступились гордостью, то можно и в этом вопросе поступиться.

budden писал(а):
Ну не суть, достаточно и примера с ББ. Да и вообще, полно примеров, когда мода влияет на решения.

Какая мода? Какая гордость? Там вполне конкретная техническая задача решалась (в коммерческой фирме, отмечу) -- совместная работа Явы и КП в рамках Jbed.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: точки с запятой
СообщениеДобавлено: Пятница, 20 Август, 2021 10:27 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4546
Откуда: Россия, Орёл
Олег, Денис. Идите выяснять отношения в ЛС, пожалуйста, сразу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: точки с запятой
СообщениеДобавлено: Пятница, 20 Август, 2021 10:47 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1344
Борис Рюмшин писал(а):
budden писал(а):
Ну в общем-то вопрос про точки с запятой - гораздо более мелкий, чем система типов. Если уж в типах поступились гордостью, то можно и в этом вопросе поступиться.

budden писал(а):
Ну не суть, достаточно и примера с ББ. Да и вообще, полно примеров, когда мода влияет на решения.

Какая мода? Какая гордость? Там вполне конкретная техническая задача решалась (в коммерческой фирме, отмечу) -- совместная работа Явы и КП в рамках Jbed.

Гордость - это, может быть и фигура речи, а мода точно при деле. Ведь решалась же техническая задача совместной работы Явы и КП, а не Кобола и КП. А почему? Потому что возникла мода на Яву. Если вернуться к точкам с запятой, то оказывается, что Олег идёт в мейнстриме того, что делается в рамках Оберона, хотя этот мейнстрим, в своё очередь, находится не в мейнстриме того, что делается в других ЯП. Хотя мейнстримом из ЯП является JS, где это сделано ещё намного хуже.

Надо всё же понять правило для Go, займусь этим.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: точки с запятой
СообщениеДобавлено: Пятница, 20 Август, 2021 11:34 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1344
Итак. согласно спецификации точка с запятой в Го обязательна и вставляется в конце строки после:

Цитата:
- 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,
но вместо перечисления большого списка ключевых слов, которые непонятно по какому принципу отобраны, мы
назовём одно понятие.

Кстати, о птичках - голанг - это не очень сильно переделанный активный оберон (и плюс заимствования из языков, о которых я ничего не знаю, поэтому и не могу увидеть этих заимствований). Но там ради моды приделали фигурные скобочки. Это к вопросу о моде.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: точки с запятой
СообщениеДобавлено: Пятница, 20 Август, 2021 11:36 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1344
И кстати, если это правило заменить на просто "точки с запятой необязательны", то грамматика останется однозначной. Верно я говорю или нет? Похоже, что вообще говоря - нет, но с учётом того, что значение выражения должно быть использовано - похоже, что да. Надо потом доразобраться. Я начал с того, что радостно набил в 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"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: точки с запятой
СообщениеДобавлено: Пятница, 20 Август, 2021 13:11 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1344
Цитата:
Относительно оберонов - просто по идеологии их построения, НЕ ДОЛЖНО появляться даже намёка на мысль о "необязательности" какого-то элемента синтаксиса. Он - либо обязательно ставится в данном месте, либо, никто даже не заикается о возможности его появления здесь.


Влад, это Ваше представление об Обероне. На самом деле в Оберонах прежде всего важно то, что сказал Вирт. Я тоже попал в эту логическую ловушку. Не забываем, что Оберон - это учебный язык (для обучения и программировани, и созданию компиляторов), или язык оптимизированный под минимальную трудоёмкость создания, с элементами вкусовщины. Его черты не выводятся из каких-то общих принципов. А потом его для чего-то полезного тоже применили, он стал ветвиться и т.п.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: точки с запятой
СообщениеДобавлено: Суббота, 21 Август, 2021 11:12 

Зарегистрирован: Пятница, 11 Январь, 2019 19:26
Сообщения: 247
Откуда: Russia
Цитата:
А как же фронтэнд для 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 всё же приходилось ставить разделитель в этих местах. Сейчас эту проблему исправили и сделали синтаксис чище.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: точки с запятой
СообщениеДобавлено: Суббота, 21 Август, 2021 12:37 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1344
Сергей, спасибо за пояснения!

Цитата:
это режим для REPL, в котором разделители ; не сильно нужны.

Сказать точнее - это режим, в котором каждому придёт в голову, что в bash их нет. Вот кстати в VxWorks есть подобное
Код:
Execute C statements.
-> test = malloc(100); test[0] = 10; test[1] = test[0] + 2
-> printf("Hello!")


Цитата:
Также для этого полезны и объявления переменных по месту ( declaration statement ), автовывод типа и другие вещи, которые ввели в язык.

Да они и сами по себе полезны, без REPL. Или сами по себе вредны.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: точки с запятой
СообщениеДобавлено: Суббота, 21 Август, 2021 23:51 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1344
Интересно, а если сделать так:

Код:
* точка с запятой обязательна
* но там, где она ожидается, за неё может сойти и конец строки
* там, где точка с запятой не ожидается, конец строки равен пробелу


В этом случае a := b b := a будет синтаксической ошибкой, а
Код:
begin
end

- не будет.

При этом всё же правило проще, чем в go. Пока не думал над этим всерьёз.
Хотя, если хотим однозначности, то нужно сказать, что если ожидается конец оператора, то
им может быть или точка с запятой, или конец строки, но не оба. Т.е. если точка с запятой в конце строки не нужна, то она и запрещена. В этом случае
Код:
a := b; (* ошибка *)
b := a

a := b; b := a (* норм *)

a := b (* норм *)
b := a


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: точки с запятой
СообщениеДобавлено: Четверг, 09 Сентябрь, 2021 15:54 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1344
В ШАЯ правила тоже не слишком простые: точка с запятой подразумевается в конце строки, а также вставляются "неявные переносы строк":


Цитата:
перед словами все, кц, кц_при;
после слов нач, выбор, нц (только в случае цикла нц-кц), раз;
перед и после слов то, иначе, при;
перед словом при и после двоеточия в при-строке.


Возможности отменить действие конца строки я не углядываю, причём, формулировки тоже достаточно мутные.
Пообщался с педагогом на тему необязательности точек с запятой - он сказал, что это плохо для школьников. Точки с запятой делают ситуацию предельно ясной. Да, профессионалов они могут раздражать. Так и получается, что бывают разные языки для разных применений и к одному идеалу они несводимы (впрочем, это и раньше было ясно).

Итого, я вижу только два варианта, которые я называл бы простыми:
  • точки с запятой везде обязательны (это рекордсмен по простоте) - реализован в Обероне
  • конец строки - это конец строки, но его действие можно отменить спец.значком. Точка с запятой вставляет
    конец оператора в любом месте. Это соглашение даёт некрасивый код в тех местах, где переносы нужны, и оно сложнее - реализован в Бейсике, tcl и, насколько я могу понять, в bash

Тут мне придётся снять шляпу перед Виртом. Хотя... необязательность точек с запятой перед END ставит под сомнение простоту этого варианта. Нет, похожу в шляпе пока что.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: точки с запятой
СообщениеДобавлено: Четверг, 16 Сентябрь, 2021 12:21 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3131
Точка с запятой чаще всего не ставится, если оператор записан в одну строку
IF var THEN Do1 ELSE Do2 END;
Тут точки с запятой были бы синтаксическим мусором...

В следующем случае предпочтительно использовать точки с запятой, так как могут добавиться строки после вызова Do1, и тогда придётся менять строку помимо добавленной... И в разных дифах - это уже будет выглядеть не очень симпатично.

IF var THEN
Do1;
ELSE
Do2;
END;

В таких многострочных конструкциях тоже раньше удалял точки с запятой, хотя Фёдор Васильевич рекомендовал в своих руководствах ставить тут точку с запятой, из вышеописанных соображений. И я теперь склоняюсь к тому, что это разумные рассуждения.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: точки с запятой
СообщениеДобавлено: Понедельник, 20 Сентябрь, 2021 09:43 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1344
В этой теме речь идёт не о том, как ставить точки с запятой в существующем Обероне, а о том, как ослабить эти правила. Выяснилось, что точки с запятой из грамматики можно вообще выкинуть и при этом грамматика останется однозначной, хотя расстояние до ошибки уменьшится. Также выяснилось, что этот режим применён не позднее, чем в A2 (режим Lax), и добавились ещё применения.

Также здесь сравниваются различные варианты, как обходиться с точками с запятой, если делать их ещё более необязательными, чем они есть сейчас.


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

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


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

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


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

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2021, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB