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

Новый синтаксис приведения (охраны) типа. Использовать "x(:T)" вместо x(T)
https://zx.oberon.org/forum/viewtopic.php?f=32&t=460
Страница 1 из 4

Автор:  Saferoll [ 25 июн 2019, 22:31 ]
Заголовок сообщения:  Новый синтаксис приведения (охраны) типа. Использовать "x(:T)" вместо x(T)

В работе 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).

Автор:  vlad [ 26 июн 2019, 04:39 ]
Заголовок сообщения:  Re: Новый синтаксис приведения (охраны) типа. Использовать "x(:T)" вместо x(T)

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


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

Автор:  Saferoll [ 26 июн 2019, 06:25 ]
Заголовок сообщения:  Re: Новый синтаксис приведения (охраны) типа. Использовать "x(:T)" вместо x(T)

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

Автор:  Zorko [ 26 июн 2019, 06:53 ]
Заголовок сообщения:  Re: Новый синтаксис приведения (охраны) типа. Использовать "x(:T)" вместо x(T)

Олежек, поддерживаю.

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

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

Автор:  Saferoll [ 26 июн 2019, 15:47 ]
Заголовок сообщения:  Re: Новый синтаксис приведения (охраны) типа. Использовать "x(:T)" вместо x(T)

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

Автор:  trurl [ 28 июн 2019, 12:58 ]
Заголовок сообщения:  Re: Новый синтаксис приведения (охраны) типа. Использовать "x(:T)" вместо x(T)

А почему не просто x:T?

Автор:  Zorko [ 28 июн 2019, 15:50 ]
Заголовок сообщения:  Re: Новый синтаксис приведения (охраны) типа. Использовать "x(:T)" вместо x(T)

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

Автор:  Saferoll [ 28 июн 2019, 18:08 ]
Заголовок сообщения:  Re: Новый синтаксис приведения (охраны) типа. Использовать "x(:T)" вместо x(T)

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

Автор:  SovietPony [ 01 июл 2019, 12:49 ]
Заголовок сообщения:  Re: Новый синтаксис приведения (охраны) типа. Использовать "x(:T)" вместо x(T)

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

Автор:  Zorko [ 01 июл 2019, 14:17 ]
Заголовок сообщения:  Re: Новый синтаксис приведения (охраны) типа. Использовать "x(:T)" вместо x(T)

Да, это будет полезно. Сам о таком уточнении думал.

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

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