OberonCore

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

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




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

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


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

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Мне тоже нравится.
Тогда еще по поводу if-fi спрошу.
По аналогии с циклом можно сделать так:
Код:
if
|expr1 do ...
|expr2 do ...
...
|exprk do ...
end

Но тут мне кажется, что лучше традиционный двухпутевой if.


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

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Валерий Лаптев писал(а):
Мне тоже нравится.
Тогда еще по поводу if-fi спрошу.
По аналогии с циклом можно сделать так:
Код:
if
|expr1 do ...
|expr2 do ...
...
|exprk do ...
end

Но тут мне кажется, что лучше традиционный двухпутевой if.


Нет, не лучше. Лучше иметь оба варианта. И вот почему:

1) Давно ощущается потребность в чем-то среднем между операторами case и if, что бы по-возможности объединяло прозрачность, однозначность и надежность case с гибкостью и быстротой записи if.

2) Такая форма записи оператора позволит в семантическом редакторе производить настройку его поведения с помощью параметра. Например, можно потребовать, чтобы проверялись все ветки, и если по ошибке выполнены условия двух или более, то производились бы какие-то действия. Или можно потребовать, чтобы выполнялись все ветки, в которых условия имеют значение "истина". Или, наоборот, чтобы выполнялась только первая ветка с условием "истина" - с последующим выходом из оператора.

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

Я бы еще добавил дефолтную ветку else.


Оператор присваивания из Вашего предыдущего поста прекрасно записывается в табличку в семантическом редакторе. В таблице может быть сотня строк, и это никак не сказывается на понимании, в отличие от текста. Таблицу можно сортировать, фильтровать, копировать в Excel и обратно и т.п. Более того, в алгоритме может быть помещена просто ссылка на таблицу, считываемую из данных.

Может быть и еще одна - табличная форма оператора if, в которой значение некоторой целочисленной переменной принимает те или иные значения в зависимости от выполнения тех или иных условий. Тогда после этого оператора можно сразу ставить оператор case с этой переменной.

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


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

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Про else - согласен. Просто забыл.
Согласен, что можно иметь оба.
Теперь еще про традиционные формы циклов, к которым все привыкли (хотя для новичков - пофиг, они традиционных и не знают :) ).
Цикл while хорошо получается:
Код:
while expr do ... end

Для одного (или вообще для первого) выражения значок | можно пропустить.
А вот repeat получается плохо.
Код:
while do ... | ~expr do end

После do перед end - пусто.
Значок ~ означает отрицание
1. Значит ли это, что сам Дейкстра предпочитал подсознательно цикл while. Я, кстати, тоже практически НИКОГДА не использую цикл repeat по причине постоянных ошибок в логическом выражении цикла, и цикл do-while тоже. Хотя в последнем случае ошибок не делаю.
2. Значит ли это, что в язык нужно добавлять обычные формы циклов.
Похоже, что надо.
Второй пример я бы хотел видеть таким:
Код:
do ... | ~expr end

Фактически это - синтаксический сахар.
Но цикл со счетчиком - по-любому добавить придется.
Тут тоже вариантов много. На РСДН в теме о техникеи программирования один даже написал:
Цитата:
С каких это пор while стал удобным способом поиска?
Всю жизнь поиск производил так:

Код:
string[] items;
foreach (string item in items)
{
  if (item == condition)
    return item;
}

Если foreach в языке нет, тогда через for, что похуже, конечно, но понятно как делать:
Код:
for (int i = 0; i < items.Length; ++i)
{
  if (items[i] == condition)
    return items[i];
}

А while для поиска как можно использовать?
ps
Я согласен с тем, что технику программирования нужно ставить, но использование while для поиска это антитехника.

Вопрос в том, делатьь ли foreach или традиционную форму с явной переменной цикла?
ИМХО foreach - это тоже синтаксический сахар. Явная переменная нам позволяет же и вычисления выполнять, а не только перебирать элементы контейнера.
Поэтому я склоняюсь к явной переменной. Но, может быть, еще и foreach добавить? Или поступим как в С++ - алгоритм foreach включим в библиотеку?


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

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

1) Семантический редактор должен иметь полную коллекцию разнообразных настраиваемых с помощью мыши управляющих конструкций. Как при их написании, так и при чтении можно будет воспользоваться контекстной справкой, чтобы сразу понять точный механизм их действия.

2) Не стоит отказываться от абстрактных лаконичных высокоуровневых конструкций (foreach) только потому, что их можно моделировать низкоуровневыми (for). Параметр цикла нужен не всегда, и зачем в таком случае загромождать программу лишней переменной? Да и вообще, запись на языке программирования должна быть как можно ближе к тем терминам, в которых изначально думает разработчик. Он ведь думает так: перебрать все элементы массива (вариант: записи файла). Вот если вдруг в теле цикла понадобится параметр, тогда у программиста должна быть возможность парой щелчков мыши заменить foreach на for с уже подставленным по умолчанию параметром.

3) Традиционные конструкции while и if не должны быть частными случаями многоветочных. Они должны быть совершенно самостоятельными элементами коллекции управляющих конструкций.

4) В семантическом редакторе с точки зрения пользователя не должно быть никакой границы между языком программирования и стандартной библиотекой. Поэтому фраза "вынести из языка в библиотеку" должна потерять смысл. Какие-то подключаемые библиотеки тоже возможны - для них граница будет.

5) Цикл repeat, возможно, нуждается в коренной переделке. Он может стать по синтаксису ближе к while: условие должно переместиться в заголовок цикла и потерять отрицание. Скорее всего, к while просто будет добавлен какой-то параметр. Что-то более конкретное я пока не придумал.

6) В многоветочных конструкциях вроде case вертикальные черточки имеет смысл заменить на кружочки, квадратики, ромбики или тругольные стрелки, которыми обычно выделяют перечисляемые абзацы. И вообще, нужно широко использовать юникод. Программа в семантическом редакторе - это не текст, и поэтому можно вполне избавиться от аскетизма "текстовых" языков программирования. Например, сравнения => и <= нужно заменить обычными математическими знаками, а двухсимвольный оператор присваивания - каким-нибудь юникодовским значком вроде ←.


Последний раз редактировалось Сергей Прохоренко Четверг, 20 Май, 2010 22:54, всего редактировалось 1 раз.

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

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Сергей Прохоренко писал(а):
Мое мнение:

1) Семантический редактор должен иметь полную коллекцию разнообразных настраиваемых с помощью мыши управляющих конструкций. Как при их написании, так и при чтении можно будет воспользоваться контекстной справкой, чтобы сразу понять точный механизм их действия.

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


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

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

1) Семантический редактор должен иметь полную коллекцию разнообразных настраиваемых с помощью мыши управляющих конструкций. Как при их написании, так и при чтении можно будет воспользоваться контекстной справкой, чтобы сразу понять точный механизм их действия.

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


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


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

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


Хотелось бы обратить внимание, что такая постановка вопроса стара, как сама информатика. Однако смысл работы "разработчика" как раз и заключается в проекции задачи на машину (удачно абстрагированную языком).
Есть утопические мечты о том, что "разработчик просто опишет, что ему нужно - и машина поймёт". Доводя эту мечту до крайности, мы придём к старой наивной мечте - об управлении машиной на естественном языке. А теперь задумаемся: даже если бы это стало возможным, то мы потеряли бы главное преимущество - возможность точно выполнять предписанное, обладать предсказуемым поведением. Чем выше уровень взаимодействия, тем больше возможностей непредвиденного поведения ("машина не так поняла") и тем больше усилий надо предпринимать для выяснения, "а так ли поняла машина".

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

Это не дело.

Ваши идеи семантического представления - и некоторые другие (библиотеки этапа составления программы, как в электронных САПР) - интересны и актуальны; но если задать неверный общий вектор (поставить по отношению к разработчикам чисто "потребительские" цели, вместо "понимательных" и "воспитательных"), то самые существенные идеи могут просто утонуть.. в потоке... :)


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

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


Согласен. Но меня трудно упрекнуть в экстремизме. Если декларативная форма в каком-то конкретном случае недостаточно очевидна, то надо возвращаться к процедурной.


Теперь об операторе foreach. Можно, в принципе, соединить преимущества этого оператора с преимуществами оператора for:

Код:
foreach MMM(,j,)
    MMM(i,j,k) := что-нибудь
end;


эквивалентно

Код:
var
i,j,k : integer
for j := 1 to m (*от нижней границы до верхней*)
    MMM(i,j,k) := что-нибудь
end;


Последний раз редактировалось Сергей Прохоренко Пятница, 30 Апрель, 2010 19:23, всего редактировалось 1 раз.

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

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Илья Ермаков писал(а):
Вместо формирования у разработчика такой ясности мышления и доведения задачи до такого уровня декомпозиции, чтобы она гладко ложилась на данную (абстрагированную) машину, всяческие декларативные технологии пытаются позволить ему формулировать программу прямо на том уровне недодуманности и неточности, на котором он сидит. "Что вижу - про то и пою".

Это не дело.

Ваши идеи семантического представления - и некоторые другие (библиотеки этапа составления программы, как в электронных САПР) - интересны и актуальны; но если задать неверный общий вектор (поставить по отношению к разработчикам чисто "потребительские" цели, вместо "понимательных" и "воспитательных"), то самые существенные идеи могут просто утонуть.. в потоке... :)

Вот! Илья, как всегда, все очень хорошо сформулировал!


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

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


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

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Сергей Прохоренко писал(а):
Преподаватели "спелись" против несчастных студентов :D (я отец одного из них) - хотят воспитывать :twisted: . Ну, лишь бы не забыли о том, что разрабатываемый семантический редактор только тогда будет по-настоящему востребованным в обучении, когда профессиональные программисты признают его полезным для себя. :wink:

Ну, мы и признаем полезным... Илья - в настоящем, я - в прошлом - профессиональные программисты... :)


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

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

Ну, мы и признаем полезным... Илья - в настоящем, я - в прошлом - профессиональные программисты... :)


Прям как в том анекдоте: "А чего нас бояться?"

Нет, я имел в виду, когда широкие программистские массы отшвырнут подальше Вижуалстудию, Эклипс и Дельфи ради семантического редактора, а Микрософт с Гуглом и Ораклом наперегонки будут предлагать миллиарды за Вашу компанию (или бесплатно воровать идеи).


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

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Сергей Прохоренко писал(а):
Прям как в том анекдоте: "А чего нас бояться?"

Нет, я имел в виду, когда широкие программистские массы отшвырнут подальше Вижуалстудию, Эклипс и Дельфи ради семантического редактора, а Микрософт с Гуглом и Ораклом наперегонки будут предлагать миллиарды за Вашу компанию (или бесплатно воровать идеи).

:mrgreen: :mrgreen: :mrgreen:


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

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Вот вариант многоветочных конструкций, о которых писал Валерий Лаптев:

Вложение:
Многоветочные конструкции.PNG
Многоветочные конструкции.PNG [ 12.06 КБ | Просмотров: 9488 ]


В данном случае код приспособлен под структурный/семантический редактор. Поэтому код не содержит "end" и ";", которые заменяются графическими элементами.

Верхний левый угол - обычная длинная форма условного оператора
Нижний левый угол - переключатель (case)
Верхний правый угол - цикл Дейкстры
Нижний правый угол - модификация цикла Дейкстры, содержащаяся в Драконе

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


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Зачем нужна альтернативная форма цикла Дейкстры, понять я так и не смог.

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

Конечно, можно обернуть (вычисление операнда) в локальную процедуру, но как вариант можно подумать про такой вариант LOOP:

Во-первых, допускаются несколько веток. Для конкретности пусть будет ключевое слово BRANCH:
Код:
LOOP
   последовательность операторов
BRANCH
   последовательность операторов
......
END

Начинаем выполнение в точке сразу после LOOP, куда возвращаемся после выполнения последовательности в любой ветке.

Дальше: EXIT запретить, но вместо него требовать, чтобы в каждой ветке -- и обязательно только на самом верхнем уровне -- присутствовал хотя бы один оператор "охраны", аналогичный ASSERT, например, в таком виде:
GUARD( логич. условие );
Смысл оператора: при выполнении условия выполнение ветки продолжается;
в противном случае попадаем в точку сразу после следующего BRANCH, а если такого нет, то последнего END.

Например, лин. поиск
Код:
WHILE (ограничение поиска) & ~(условие поиска) DO
   перейти к след. кандидату
END;

переписывается так:
Код:
LOOP
GUARD( ограничение поиска );
GUARD( ~(условие поиска) );
   перейти к след. кандидату
END


Долго думал и укрепился во мнении, что никаких других вариантов LOOP не должно быть нужно при систематическом построении циклов.

Можно и вообще выкинуть LOOP, разрешив такой GUARD в обычном WHILE ... DO ... ELSIF ... DO ... END,
-- вряд ли WHILE TRUE будет накладно, а может и компилятору будет нетрудно интерпретировать такое как чистый LOOP.


Последний раз редактировалось Info21 Пятница, 14 Май, 2010 18:41, всего редактировалось 1 раз.

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 13 Май, 2010 22:48 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
... а кто-нить из благородных донов не соблаговолит объяснить весь изначально-глубинный смысл мероприятия? ...

ЗЫ в смысле: "а, за что, собственно, боремся?"


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Info21 писал(а):
...Это единственная ситуация, в которой у меня есть несколько LOOP-ов.

Конечно, можно обернуть в локальную процедуру...
Была ли количественно измерена практическая потеря производительности при таком "оборачивании"?


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

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


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

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


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

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


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

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