Автор Тема: [Oberon-07M] небольшие изменения синтаксиса  (Прочитано 24502 раз)

Rifat

  • Jr. Member
  • **
  • Сообщений: 62
    • Просмотр профиля
Сейчас в языке Oberon-07 последнее поле в записи не должно заканчиваться символом ";".
Например, RECORD a: INTEGER; b: INTEGER END - можно, а RECORD a: INTEGER; b: INTEGER; END - нельзя.
Это следует из синтаксиса языка:
RecordType  =  "RECORD" ["(" BaseType ")"] [FieldListSequence] "END".
BaseType  =  qualident.
FieldListSequence  =  FieldList {";" FieldList}.
FieldList  =  IdentList ":" type.
IdentList  =  identdef {"," identdef}.
Мне кажется, что это не всегда удобно, так как если, например, в структуре 10 полей, то последовательно добавляя поля, нужно всегда иметь в виду, что последнее поле не должно заканчиваться символом ";". Если случайно добавить этот символ, то будет ошибка компиляции. А если изначально было все правильно, а затем пришлось добавить еще несколько полей, то можно забыть поставить символ ";" после десятого поля.

В Компонентном Паскале точка с запятой после последнего поля не вызывает ошибку, это следует из синтаксиса.
Type  =   Qualident
     |  ARRAY [ConstExpr {"," ConstExpr}] OF Type
      | [ABSTRACT | EXTENSIBLE | LIMITED]
           RECORD ["("Qualident")"] FieldList {";" FieldList} END
      | POINTER TO Type
     | PROCEDURE [FormalPars].
FieldList    =   [IdentList ":" Type].

Кто как думает, почему в Oberon-07 нельзя ставить точку запятой после последнего поля, есть ли здесь какое-то скрытое рациональное зерно?
Нужно ли изменять синтаксис языка Oberon-07M чтобы можно была ставить точку с запятой после последнего поля?

Илья Ермаков

  • Full Member
  • ***
  • Сообщений: 177
    • Просмотр профиля
    • OberonCore
Re:[Oberon-07M] небольшие изменения синтаксиса
« Ответ #1 : Апрель 22, 2011, 03:22:40 pm »
Кто как думает, почему в Oberon-07 нельзя ставить точку запятой после последнего поля, есть ли здесь какое-то скрытое рациональное зерно?

Да просто чтобы уменьшить вариативность. Меньше вариантов формы - меньше заморочек. Больше повода поговорить о важных вещах :)

Rifat

  • Jr. Member
  • **
  • Сообщений: 62
    • Просмотр профиля
Re:[Oberon-07M] небольшие изменения синтаксиса
« Ответ #2 : Апрель 22, 2011, 03:29:57 pm »
Сейчас подумал, что может быть для однопроходного компилятора, который сразу код генерирует, немного проще если после последнего поля нет точки с запятой.

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re:[Oberon-07M] небольшие изменения синтаксиса
« Ответ #3 : Апрель 22, 2011, 03:49:38 pm »
О компиляторах думают, а о людЯх - нет  :)

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re:[Oberon-07M] небольшие изменения синтаксиса
« Ответ #4 : Апрель 22, 2011, 04:30:39 pm »
Сейчас в языке Oberon-07 последнее поле в записи не должно заканчиваться символом ";".
...
Мне кажется, что это не всегда удобно, так как если, например, в структуре 10 полей, то последовательно добавляя поля, нужно всегда иметь в виду, что последнее поле не должно заканчиваться символом ";". Если случайно добавить этот символ, то будет ошибка компиляции. А если изначально было все правильно, а затем пришлось добавить еще несколько полей, то можно забыть поставить символ ";" после десятого поля.

В Хаскелле последнее поле записи тоже не должно иметь разделителя, синтаксис:

record = identifier "{" fielddecl [{ , fielddecl }] "}"

В принципе, можно столкнуться с таким же неудобством, однако в распространённых руководствах по стилю программирования на Хаскелле предлагается такое правило:
data Person = Person
    { firstName :: String  -- ^ First name
    , lastName  :: String  -- ^ Last name
    , age       :: Int     -- ^ Age
    } deriving (Eq, Show)

С непривычки может показаться не очень, но если систематически следовать таким правилам, то код выглядит аккуратно и всё удобно.

http://snapframework.com/docs/style-guide

Пример для Оберона:
TYPE Person = RECORD
                firstName : String  (** First name *)
              ; lastName  : String  (** Last name  *)
              ; age       : Int     (** Age        *)
              END;
« Последнее редактирование: Апрель 22, 2011, 04:36:08 pm от Geniepro »
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re:[Oberon-07M] небольшие изменения синтаксиса
« Ответ #5 : Апрель 22, 2011, 05:07:57 pm »
Вот давно хотел спросить - зачем там крышка (^)?    -- ^ First name


Comdiv

  • Newbie
  • *
  • Сообщений: 25
    • Просмотр профиля
Re:[Oberon-07M] небольшие изменения синтаксиса
« Ответ #6 : Апрель 22, 2011, 05:38:42 pm »
Не замечал раньше, что в Компонентном Паскале ";" можно ставить подряд сколько угодно.

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re:[Oberon-07M] небольшие изменения синтаксиса
« Ответ #7 : Апрель 22, 2011, 05:45:23 pm »
Вот давно хотел спросить - зачем там крышка (^)?    -- ^ First name

-- | и -- ^    -- это указание для таких программ, как Haddoc, которые по исходнику автоматически строят документацию по программе, что эти комментарии нужно включить в соответствующих местах в сгенерированной документации.

Теоретически, если кто-то удосужится сделать нормальное IDE для Хаскелла, там эти комментарии будут отображаться во всплывающей подскащке при наведении на курсора мышки на идентификатор...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Илья Ермаков

  • Full Member
  • ***
  • Сообщений: 177
    • Просмотр профиля
    • OberonCore
Re:[Oberon-07M] небольшие изменения синтаксиса
« Ответ #8 : Апрель 22, 2011, 08:14:20 pm »
Не замечал раньше, что в Компонентном Паскале ";" можно ставить подряд сколько угодно.

Если в языке есть понятие "пустой оператор", то можно. А такое понятие обычно вводится. Например, чтобы можно было писать цикл с пустым телом.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re:[Oberon-07M] небольшие изменения синтаксиса
« Ответ #9 : Апрель 22, 2011, 10:43:27 pm »
Если в языке есть понятие "пустой оператор", то можно. А такое понятие обычно вводится. Например, чтобы можно было писать цикл с пустым телом.

Кто о чем, а оберонщики о циклах ;)

P.S. В питоне есть специальное ключевое слово для этого - "pass". При этом к точкам с запятой и лишним запятым никто тоже не придирается... Человеческий подход без синтаксического догматизма ;)

Илья Ермаков

  • Full Member
  • ***
  • Сообщений: 177
    • Просмотр профиля
    • OberonCore
Re:[Oberon-07M] небольшие изменения синтаксиса
« Ответ #10 : Апрель 23, 2011, 09:34:11 am »
Сведение к минимуму возможных внешних форм выражения способствует концентрации внимания на существенном. Очевидный факт (известный и художникам, и дизайнерам, и др.). Что тут ещё мусолить. Радоваться надо, если что-то стало можно записать вместо 2-х идентичных ("копьеломательных") способов одним.

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

Rifat

  • Jr. Member
  • **
  • Сообщений: 62
    • Просмотр профиля
Re:[Oberon-07M] небольшие изменения синтаксиса
« Ответ #11 : Апрель 23, 2011, 12:57:03 pm »
По-моему, немного нелогично, что точку с запятой нельзя ставить после последнего поля при описании записей, но можно ставить, например, после последнего опрератора внутри цикла.
Как мне кажется надо сделать, чтобы и после последнего поля в записи можно было ставить точку с запятой или же наоборот запретить точку с запятой после последнего оператора внутри блоков WHILE, IF, FOR ...

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re:[Oberon-07M] небольшие изменения синтаксиса
« Ответ #12 : Апрель 23, 2011, 03:30:17 pm »
Сведение к минимуму возможных внешних форм выражения способствует концентрации внимания на существенном.

Здесь речь не о формах, а о технологичности. То, о чем пишет Грабин ;) Запрещать лишние точки с запятой в угоду чистоте формальной записи синтаксиса - нетехнологично. Потому что создает ненужные проблемы на производстве (при написании кода в текстовом редакторе).

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re:[Oberon-07M] небольшие изменения синтаксиса
« Ответ #13 : Апрель 23, 2011, 04:07:42 pm »
Для любителей принципа Калашникова: автомат должен работать в дождь, снег и грязь. А в данном случае поставил лишнюю (с т.з. компилятора!) точку с запятой, и автомат отказал.

Илья Ермаков

  • Full Member
  • ***
  • Сообщений: 177
    • Просмотр профиля
    • OberonCore
Re:[Oberon-07M] небольшие изменения синтаксиса
« Ответ #14 : Апрель 24, 2011, 09:00:20 pm »
Во-первых, аналогия какая-то очень дальняя. Разрешать грязь в исходных текстах? :) Это грязь не от условий применения (от обстоятельств задач), а грязь на производстве :)

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