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

Твердыня модульных языков
Текущее время: 26 окт 2021, 02:14

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




Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу 1, 2, 3, 4  След.
Автор Сообщение
СообщениеДобавлено: 25 июн 2019, 22:31 
Не в сети
Администратор
Аватара пользователя

Сообщения: 271
Откуда: Россия
В работе Patrik Reali "Критика языка Oberon" справедливо указан недостаток синтаксиса:
терм x(T) может означать либо вызов процедуры x с параметром Т, либо приведение переменной х к типу Т. Только из синтаксиса это понять нельзя, требуется семантическая информация.

Компилятор, конечно, такой информацией обладает и без проблем разбирается, какой из случаев имеет место. Но этот недостаток синтаксиса снижает наглядность и вызывает затруднения при разборе чужого кода, а также путаницу у начинающих (в одном из видеоуроков Ивана Денисова слушатель принял такое приведение типа за вызов функции).
Более удачным был бы синтаксис "x(:T)". Двоеточие после открывающейся скобки не может встретиться в каком-то корректном оберон-выражении, поэтому конфликтов не должно возникать.
Лучше бы, если это двоеточие было обязательно для приведения (охраны) типов. Но для совместимости с прочими версиями Оберона придется, видимо, сделать его необязательным, добавляемым только для наглядности.
Для этого можно изменить процедуру selector в модуле OPP. Во фрагмент
Код: "OBERON"
  1. ...
  2. ELSIF (sym = lparen) & (x^.class < Nconst) & (x^.typ^.form # ProcTyp) &
  3. ((x^.obj = NIL) OR (x^.obj^.mode # TProc)) THEN
  4. OPS.Get(sym);
  5. IF sym = ident THEN
  6. ...
добавить одну строчку, чтобы получить
Код: "OBERON"
  1. ...
  2. ELSIF (sym = lparen) & (x^.class < Nconst) & (x^.typ^.form # ProcTyp) &
  3. ((x^.obj = NIL) OR (x^.obj^.mode # TProc)) THEN
  4. OPS.Get(sym);
  5. IF (sym = colon) & (OPM.Lang = "3") THEN OPS.Get(sym) END;
  6. IF sym = ident THEN
  7. ...
Добавленная строка просто пропускает двоеточие, если таковое добавлено (для языка О3).


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 26 июн 2019, 04:39 
Не в сети

Сообщения: 108
Saferoll писал(а):
Более удачным был бы синтаксис "x(:T)"


Чего за криптота? "x AS T" всяк лучше...


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

Сообщения: 271
Откуда: Россия
2Vlad. Может быть и лучше, но потребуется новое ключевое слово, а это меньшая совместимость, чем необязательное двоеточие. В то же время, обозначение "x(:T)" не такое уж и "крипто". Во многих естественных языках скобки используются для уточнения чего-то, в языках Паскаль, Модула, Оберон двоеточие используется для задания типа переменной, поэтому "x(:T)" достаточно наглядно и понятно - это "уточнение типа". Да и от стандартного обозначения не намного отличается.


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 26 июн 2019, 06:53 
Не в сети
Аватара пользователя

Сообщения: 1001
Откуда: Днепропетровская обл.
Олежек, поддерживаю.

Однако тогда надо же для O3 выпилить старое поведение по приведению типа?

Код: "OBERON"
  1. IF OPM.Lang = "3" THEN CheckSym(colon) END;


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 26 июн 2019, 15:47 
Не в сети
Администратор
Аватара пользователя

Сообщения: 271
Откуда: Россия
Zorko писал(а):
Олежек, поддерживаю.
Однако тогда надо же для O3 выпилить старое поведение по приведению типа?
Это вопрос. Если двоеточие необязательно, т.е. можно приводить тип и только скобками, как в других версиях, то получается большая совместимость с другими Оберонами, хотя бы в одну сторону.
Если двоеточие обязательно, то получается строго отличие в синтаксисе и несовместимость в обе стороны. Хотя и большая наглядность синтаксиса ценой большей обособленности от других версий. Пока у нас немного пользователей О3, а еще меньше количество из них использует приведение типов :)
Поэтому можно сделать обязательное двоеточие. Тогда - да, нужно добавить строку
Код: "OBERON"
  1. IF OPM.Lang = "3" THEN CheckSym(colon) END;
  2.  
вместо предлагаемой мной.


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 28 июн 2019, 12:58 
Не в сети

Сообщения: 28
А почему не просто x:T?


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 28 июн 2019, 15:50 
Не в сети
Аватара пользователя

Сообщения: 1001
Откуда: Днепропетровская обл.
В идеале было бы хорошо, но так будет сложнее парсить, да и учёт приоритета операций добавится.


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

Сообщения: 271
Откуда: Россия
trurl писал(а):
А почему не просто x:T?
Может быть путаница, например, в операторе CASE или WITH. А в скобках путаницы не будет - двоеточие после скобки ни в каком ином выражении стоять не может. Да и для человека нагляднее: скобки означают уточнение, а двоеточие - задание типа.


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 01 июл 2019, 12:49 
Не в сети
Аватара пользователя

Сообщения: 65
Откуда: Equestria
Раз тут пошло такое дело с допустимой поломкой совместимости...
Я давно подумываю про явную маркировку использования var/out-параметров для наглядности.
Код: "OBERON"
  1. PROCEDURE Code (VAR x: INTEGER);
  2. ...
  3. Code(@myvar)
Вот, сразу видно что myvar может изменить своё содержимое. Может тоже будет полезно?


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

Сообщения: 1001
Откуда: Днепропетровская обл.
Да, это будет полезно. Сам о таком уточнении думал.

А почему именно символ "@", а не, скажем, "$" или "&"?


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

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


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

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


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

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