OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 19 Апрель, 2024 15:26

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




Начать новую тему Ответить на тему  [ Сообщений: 86 ]  На страницу Пред.  1, 2, 3, 4, 5  След.
Автор Сообщение
СообщениеДобавлено: Четверг, 22 Апрель, 2010 21:23 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Валерий Лаптев писал(а):
Geniepro писал(а):
Валерий Лаптев писал(а):
Только нужно еще end в конце поставить.
Зачем?

Без end возможна двоякая интерпретация:
1. elseif - внутри цикла и проверяется на каждой итерации цикла. Это просто цикл Дейкстры непосредственно с несколькими охраняемыми командами.
2. elseif выполняется ОДИН раз после выхода из цикла, когда условие while становился ложным. Это почти так сделано в Питоне. Там стоит else после цикла.

Наличие end явно обозначает конец цикла и не допускает разночтений.

И в данном случае END успешно решает задачу "висящего" elseif


Никаких "висящих" elseif здесь нет. Двоякая интерпретация при хотя бы поверхностном изучении сообщения о языке тоже невозможна. Вот аргументы:

1. Это не Питон, а что-то вроде Оберона-07. В сообщении о языке черным по белому должно быть написано, что elseif является составной частью цикла while и выполняется так, как ему положено в цикле Дейкстры, то есть, в общем случае многократно. Я согласен, что слово elseif с точки зрения лингвистики коряво смотрится в цикле while, но так сделано в Обероне-07. Может быть, вариант "else while" смотрелся бы лучше - тут нужен коренной англосакс

2. Скобка охватывает весь блок и не дает усомниться, что elseif относится к циклу while. Если кто еще сомневается, при щелчке по скобке выделится весь блок, включая ветвь elseif

3. Эти while и elseif были не с клавиатуры вбиты, а были вставлены графическими средствами структурного/семантического редактора как единый блок

4. Закругление скобки внизу обозначает конец блока ничуть не хуже, чем END, но зато уменьшает количество лишних слов. Если Вы заметили, точек с запятой тоже нигде нет, потому что на каждой строке должен быть максимум один оператор, и редактор физически не позволит нарушить это правило


Последний раз редактировалось Сергей Прохоренко Четверг, 22 Апрель, 2010 21:56, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 22 Апрель, 2010 21:26 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Если верхний конец скобки будете начинать под while, а не над ним, то будет лучше гораздо. Сейчас глаз плохо себя чувствует, непонятно, что за конструкция - и где конец.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 22 Апрель, 2010 21:38 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Борис Рюмшин писал(а):
Вставлю своё мнение:

1) Конструкции языка должны быть замкнуты.
2) Если хочется с "двумерным" исходным текстом работать, то нужен редактор который, во-первых, работает сразу с синтаксическим деревом (то есть исходник не текстовый в принципе, во всяком случае во время работы). И во-вторых (тут я согласен с Сергеем Прохоренко, но не полностью) - поддерживает визуализацию этого исходного текста, но не просто визуализацию, а работу с этим текстом чётко как с блоками. Чтобы даже слово WHILE нельзя было (и не надо) стереть не удалив всю конструкцию целиком... правда для того, чтобы достичь удобства работы, без напряжения, с такой штукой её нужно долго-долго думать...

...а все эти "значимые отступы" и прочие костыли над простым исходником - дурь.


Очень правильно сказано. Валерий Лаптев как раз "долго-долго думает эту штуку" со студентами. Я тоже попытался внести свою скромную лепту - макет GUI такого редактора: http://sites.google.com/site/purebuilder/


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 22 Апрель, 2010 21:54 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Илья Ермаков писал(а):
Если верхний конец скобки будете начинать под while, а не над ним, то будет лучше гораздо. Сейчас глаз плохо себя чувствует, непонятно, что за конструкция - и где конец.


Мысленно продлите закругленные концы скобки горизонтальными линиями вправо. Эти линии обозначат границы блока. В принципе, может быть несколько графических вариантов выделения блока - на выбор пользователя. Например, могут быть варианты, предложенные Кириллом Осенковым (если он не будет настаивать на своих авторских правах): http://guilabs.net/
Подробности: http://blogs.msdn.com/kirillosenkov/arc ... otype.aspx


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 22 Апрель, 2010 21:59 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Я понимаю, что они обозначают границы блока.

Только здесь вот какой нюанс:
любой блок имеет как наружную часть, так и внутренние гнёзда.
Для того же WHILE - while условие ... - это наружная часть. А ниже - гнёздо для внутреннего устройства, которое и стоит выделять скобкой.

Т.е. некая строка должна быть над скобкой - это заголовок блока, его "представительная часть" в верхнем блоке.

Т.е. я читаю первый уровень - я должен иметь возможность не погружаться внутрь скобок, но видеть "представительную строку" от каждого блока.

Иначе я должен погрузиться внутрь блока, чтобы увидеть, что это WHILE и какое у него условие. А дальше глаз уже ничем не отделён от внутреннего устройства (уже вошли внутрь скобки).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 22 Апрель, 2010 22:27 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
"Наружная" часть выделяется жирным шрифтом, а внутренняя - отступом вправо. "Наружные" части разных блоков, имеющие одинаковый уровень вложенности, должны иметь одинаковый отступ. Чтобы "не погружаться" внутрь блока, его можно свернуть до заголовка одним щелчком мыши по скобке справа от блока. Есть и другой способ - зрительно пробегайте только по "внешним" частям блока. Это легко сделать, так как они выделены жирным шрифтом и имеют одинаковый уровень вложенности.

Предложенный Вами способ выделения не будет хорошо работать, если блок состоит из нескольких "внутренних" частей, разделенных "наружными" - как в длинной форме if-elsif-elsif-elsif-else-end. Если выделять скобкой только "внутренние" части, то блок целиком окажется не выделенным, а его границы - неясными.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 22 Апрель, 2010 22:36 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Значит, надо искать какое-то решение.

Структурный редактор должен отвечать тому порядку восприятия программ, которое имеется у программистов, работающих "по Дейкстре".

Иначе получаются просто удобства на тот же "литературный текст", а надо форсировать у людей блочное восприятие.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 23 Апрель, 2010 05:19 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Илья Ермаков писал(а):
любой блок имеет как наружную часть, так и внутренние гнёзда.
Для того же WHILE - while условие ... - это наружная часть. А ниже - гнёздо для внутреннего устройства, которое и стоит выделять скобкой.
Если проводить аналогию с таким блоком как процедура, то заголовок процедуры входит в блок. Все параметры, объявленные в заголовке процедуры, являются локальными по отношению к этой процедуре, то есть они структурно входят в этот блок (являются его внутренней частью).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 23 Апрель, 2010 09:09 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Они же входят и в интерфейс процедуры.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 23 Апрель, 2010 09:33 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Ну и что. Фактические параметры принадлежат блоку, в котором находится вызов процедуры, а формальные параметры всё-равно принадлежат блоку самой процедуры. Они там останутся даже в том случае, если объемлющие блоки поменять на другие.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 23 Апрель, 2010 09:49 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Обсуждаем-то визуальное представление. Нельзя упаковать всё в скобку, не оставив ничего над скобкой. Получается, что для понимания, что это за блок, глазу нужно погружаться "под крышку". И какой её смысл тогда?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 23 Апрель, 2010 09:56 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Возьмём, к примеру сишный do ... while. Если сделать как Вы предлагаете, то "наружная часть" окажется не просто "под крышкой", а под всем "гробом".


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 23 Апрель, 2010 10:02 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
igor писал(а):
Geniepro писал(а):
А просто end никакой надёжности не повышает.
Просто END успешно решает проблему висящего ELSE. А больше от него ничего и не требуется.

Успешно ли? А если там лишний if или недостающий while -- что в этом случае будет решать этот непонятно кому принадлежащий end?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 23 Апрель, 2010 10:05 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
AVC писал(а):
Geniepro писал(а):
Ведь избыточность синтаксиса Вы считаете полезной для повышения надёжности ПО?
Так ведь Вы то так не считаете. Или это у Вас аргумент исключительно "на экспорт"?
Если уж Вы ратуете за избыточность, повышающую надёжность ПО, так делайте сразу нормальную, полноценную избыточность, а не эту бесполезную полуизбыточность с непонятно к кому относящимся end.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 23 Апрель, 2010 10:10 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
geniepro писал(а):
igor писал(а):
Просто END успешно решает проблему висящего ELSE. А больше от него ничего и не требуется.

Успешно ли? А если там лишний if или недостающий while -- что в этом случае будет решать этот непонятно кому принадлежащий end?

Каждый IF и каждый WHILE должен быть сбалансирован своим END. В тех случаях, которые Вы назвали, компилятор сразу же поднимет панику.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 23 Апрель, 2010 10:14 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
igor писал(а):
Возьмём, к примеру сишный do ... while. Если сделать как Вы предлагаете, то "наружная часть" окажется не просто "под крышкой", а под всем "гробом".


Вот и пусть думают :) Конструкторы новых сред. Взялись за гуж... :)
Но навернуть на текст скобок - этого мало.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 23 Апрель, 2010 10:20 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Илья Ермаков писал(а):
Но навернуть на текст скобок - этого мало.
Да, Вы правы :) .
Борюс Рюмшин в этой ветке хорошо высказался по этому поводу.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 23 Апрель, 2010 13:50 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Вот что мне изначально не нравится в исходном цикле, так это некоторая неравноценность условий.
В цикле дейкстры все охраны равноценны. Они даже синтаксически выглядят одинаково.
В исходном же коде два условия чисто психологически выглядят неравноправно. То, что в while воспринимается "главнее". Поэтому о форме цикла дейкстры надо думать. В этом смысле loop мне нравится гораздо больше.. Только семантику его надо изменить, чтобы выход был не по exit, а при all false


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 23 Апрель, 2010 23:34 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Валерий Лаптев писал(а):
Вот что мне изначально не нравится в исходном цикле, так это некоторая неравноценность условий.
В цикле дейкстры все охраны равноценны. Они даже синтаксически выглядят одинаково.
В исходном же коде два условия чисто психологически выглядят неравноправно. То, что в while воспринимается "главнее". Поэтому о форме цикла дейкстры надо думать. В этом смысле loop мне нравится гораздо больше.. Только семантику его надо изменить, чтобы выход был не по exit, а при all false


Я ведь здесь ничего не изобретал. Просто взял конструкцию из Оберона-07 и выкинул лишний END. Разве Вирт не цикл Дейкстры реализовал?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 24 Апрель, 2010 00:40 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Илья Ермаков писал(а):
igor писал(а):
Возьмём, к примеру сишный do ... while. Если сделать как Вы предлагаете, то "наружная часть" окажется не просто "под крышкой", а под всем "гробом".


Вот и пусть думают :) Конструкторы новых сред. Взялись за гуж... :)
Но навернуть на текст скобок - этого мало.


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

Блок - это "кирпичик" для сборки алгоритма. Он должен с первого взгляда восприниматься как единое целое (и им можно манипулировать как единым целым), а не как составная конструкция из заголовка и тела. Со второго взгляда в нем можно рассмотреть каркас, состоящий не только из заголовка, но и из других частей, имеющих тот же уровень вложенности. Этот каркас вместе с объемлющей скобкой создает одно или несколько "гнезд", куда помещается программный код с бОльшим уровнем вложенности.

Для наглядности могу добавить вот такую картинку, чем-то напоминающую гребенку или схему репликации ДНК:

Вложение:
Block1.GIF
Block1.GIF [ 2.86 КБ | Просмотров: 9091 ]


Здесь оранжевым цветом обозначен каркас блока, состоящий из скобки слева (вертикальный оранжевый прямоугольник), которая "обнимает" составные части блока (if...then, elsif...then, else...then и т.п.) - горизонтальные прямоугольники. Голубые прямоугольники обозначают в Вашей терминологии "внутренние" части блока.

Еще более наглядно это в системе программирования Scratch:

Вложение:
Scratch.PNG
Scratch.PNG [ 161.74 КБ | Просмотров: 9090 ]


Конечно, агрессивный игрушечный дизайн Scratch сильно отвлекает, раздражает и утомляет (только дети способны это выдержать, и то недолго). Поэтому я заменил все эти яркие ломаные LEGO-образные конструкции блоков простой скобкой. Если не нравится скобка, то пусть пользователь выберет другой вариант выделения блока целиком - тот, который ему в данный момент больше нравится - из предложенного набора. Потом можно будет изменить вариант в любой момент, как меняют заставку на мониторе. Большой набор вариантов есть у Кирилла Осенкова.


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

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


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

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


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

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