OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 19 Июнь, 2025 15:57

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




Начать новую тему Ответить на тему  [ Сообщений: 172 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7, 8, 9  След.
Автор Сообщение
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Суббота, 06 Декабрь, 2008 20:30 
Аватара пользователя

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

Мир меняется постоянно, а инварианты остаются. Вот чтобы выжить и быть впереди, а не позади, при постоянных изменениях, нам и надо стараться их ловить, инварианты эти. А то всё подбираем "отрыжки Мелкософтов". :-)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Воскресенье, 07 Декабрь, 2008 01:31 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
Axcel писал(а):
Ну, в общем понятно, ответа нет.


Блин, ну сколько в открытые двери можно ломиться???

Вы читайте, что пишут! Я же говорил, что при отражении модели в языке, нам часто нет необходимости в цикловой переменной.
Есть операции, в которых она ПРОСТО НЕ НУЖНА ПО СМЫСЛУ.
Например (от лихтарыка):
Collection.ForEach и Collection.Find
Это - ЕСТЕСТВЕННОЕ высокоуровневое описание наших намерений относительно как всей коллекции, так и отдельных ея элементов.
Теперь встаёт вопрос о передаче фрагмента действий с элементов этой коллекции.
В простейшем случае можно обойтись ссылкой на процедуру/функцию, в аргументах которой будет "формироваться контекст" при работе с очередным элементом. Но часто бывает удобно и более естественно, передавать туда нечто, что увяжет текущий контекст (в котором вызваны Collection.ForEach и/или Collection.Find) с контекстом самих Collection.ForEach и Collection.Find... Например, кусок кода обращается к локальным переменным процедуры вызывающей Find для сравнения полей элемента коллекции с локальными (и не только!) переменными, которые "текстуально не известны" в Find.
Часто оказывается, что такая запись проще и нагляднее.
Ещё раз повторяю, мы рассматриваем данное средство (относительно ООП) именно, как один из путей удаления лишнего уровня абстракции (семантически несовместимые по уровню абстракции) работы с переменными цикла. Плюс - повышается надёжность, за счёт удаления лишних мест, где можно получить ошибки через описки...

В си-шарпе этим "нечтом" стали "замыкания"...

Относительно решения Вирта о цикле FOR, я сказал, что работа с "массивами" (как с частным случаем классов "коллекций") оказалась "размазанной" по уровням абстракции, благодаря невключению в язык FOREACH.
Кстати, тот же поиск, в случае расширения применения EXIT для всех цикловых операторов, выполнялся и ещё таким способом:
Код:
VAR foundItem : Item = NIL;
...
FOREACH item : Item IN itemArray DO
    IF Condition( item ) THEN foundItem := item; EXIT END;
END

Заметьте, что здесь ошибки быть не может с границами поиска.
Кстати, короче можно было бы записать, введи Вирт (наряду с "для каждого", операцию проверки "а есть ли?"). Но - лишних слов много... Опять-таки "лишнесть" не есть плохо или хорошо. Массив в Оберонах - не расширение какого-то коллекционного типа, в котором описанные мной операции определены, а "собственная сущность и понятие"...
Код:
VAR foundItem : Item = NIL;
       startItem : Item = NIL;
...
foundItem = FINDIF( itemArray, CheckFunc, startItem );
или
foundItem = FINDIF( itemArray, CheckFunc, NIL ); //если ищем с начала

Или
Код:
VAR foundIndex : INTEGER = -1;
...
foundIndex = FINDINDEX( itemArray, CheckFunc, 0 );


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Воскресенье, 07 Декабрь, 2008 13:06 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Остаётся тот же вопрос: как это скажется на компиляторе?
Например, Вирт удалил из компилятора для StrongARM даже райдеры массивов, т.к. они "применялись редко". А ведь именно индексация массивов - самое слабое место однопроходного компилятора (вручную не оптимизируешь: у программиста нет другой возможности выразить последовательный проход по массиву, в отличие от Си).
А тут нам предлагаются такие навороты как "замыкания".
Такое впечатление, что в приведённых примерах трудности как раз возникают из-за отказа от переменных цикла. IMHO, единственное, что может к этому подвигнуть, - стремление к обобщению кода. Например, чтобы иметь возможность поменять структуру данных коллекции. Примем это как реальную потребность и посмотрим, что можно сделать, не меняя языка.
Пусть у нас есть коллекция, её метод ForEach и необходимость передать в коллекцию не только процедуру обработки, но и некий контекст вызывающей процедуры.
Есть ли в Обероне для этого средство? Конечно, есть. Это расширяемая запись.
Например, набросок для ББ.
Код:
TYPE
    Guest = EXTENSIBLE RECORD END;
    PROCEDURE (VAR me: Guest) Do* (VAR r: ANYREC); EMPTY;

    (* пусть данная конкретная коллекция реализована как список *)
    PROCEDURE (VAR me: Collection) ForEach (VAR guest: Guest);
        VAR p: ListItem;
    BEGIN
        p := me.list;
        WHILE p # NIL DO
            guest.Do(p.data^);
            p := p.next
        END
    END ForEach;
И, пожалуйста, расширяйте сколько угодно тип Guest и передавайте любой нужный вам контекст для обработки элементов коллекции. Просто заводите локальную запись (тип которой - потомок Guest; разумеется, в данном случае нет нужды в дублировании переменных или в использовании динамической памяти - в качестве локальных переменных вызывающей процедуры используем поля записи) и передаёте в ForEach в стиле обероновской программной шины.
Зачем огород городить? :)


Последний раз редактировалось AVC Воскресенье, 07 Декабрь, 2008 13:13, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Воскресенье, 07 Декабрь, 2008 13:12 
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Воскресенье, 07 Декабрь, 2008 17:51 

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

А в чём там "трудности"?

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

Да мне, как пользователю коллекции, наплевать на внутреннее представление, поддерживающее (упорядоченную) совокупность моих элементов!
Мне важна функциональность самой коллекции по отношению к элементам, хранимым в ней!

AVC писал(а):
Примем это как реальную потребность и посмотрим, что можно сделать, не меняя языка.

Ну... - и – ЧТО? Мне что вручную теперь:
1) расширять запись полями для каждого из значений, знание о котором я хочу передать в Do?
2) писать свой код, копирующий в эти поля нужные мне значения из нужных переменных окружения в местах вызова Find/ForEach?
В конце концов, у меня ведь могут быть сотни (тысячи!) разновидностей вызовов Find или FortEach... И, к тому же, в – в сотнях (тысячах!) мест вызова, с РАЗЛИЧАЮЩИМИСЯ контекстами (наборами доступных переменных)! Для каждого из случаев прикажите пункты 1) и 2) повторять? Да – ЧУР МЕНЯ!

AVC писал(а):
Зачем огород городить? :)

"Да." (с) птыц Дяди Фёдора.
Может лучше универсальным принципом-подходом-механизмом обойтись?... :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Воскресенье, 07 Декабрь, 2008 21:53 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Владимир Лось писал(а):
AVC писал(а):
Такое впечатление, что в приведённых примерах трудности как раз возникают из-за отказа от переменных цикла.

А в чём там "трудности"?
Так ведь контекст приходится передавать?

Владимир Лось писал(а):
Ну... - и – ЧТО? Мне что вручную теперь:
1) расширять запись полями для каждого из значений, знание о котором я хочу передать в Do?
А чем это принципиально отличается от добавления локальных переменных? Вы же не отказываетесь заводить их вручную.

Владимир Лось писал(а):
2) писать свой код, копирующий в эти поля нужные мне значения из нужных переменных окружения в местах вызова Find/ForEach?
Да не нужно ничего копировать!
Просто используем запись как секцию VAR.
Например:
Код:
PROCEDURE DoSomething;
    VAR m: GuestDerivate; (* используем запись как секцию VAR *)
BEGIN
    ... (* работаем с полями записи m *)
    collection.ForEach(m);
END DoSomething;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Понедельник, 08 Декабрь, 2008 14:10 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
AVC писал(а):
А чем это принципиально отличается от добавления локальных переменных? Вы же не отказываетесь заводить их вручную.

Перменные (их существование) УЖЕ обусловлено задачей. Никакого "принуждения" или добавления "внетемовой" вещи НЕ состоялось. Лишних абстракций и действий не производится. Ваш же вариант добавляет массу "отвлекающих" моментов в коде и в логике разбора чужого кода и сопровождения...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Понедельник, 08 Декабрь, 2008 16:56 

Зарегистрирован: Воскресенье, 09 Март, 2008 22:38
Сообщения: 372
Владимир Лось писал(а):
Теперь встаёт вопрос о передаче фрагмента действий с элементов этой коллекции. В простейшем случае можно обойтись ссылкой на процедуру/функцию, в аргументах которой будет "формироваться контекст" при работе с очередным элементом. Но часто бывает удобно и более естественно, передавать туда нечто, что увяжет текущий контекст (в котором вызваны Collection.ForEach и/или Collection.Find) с контекстом самих Collection.ForEach и Collection.Find... Например, кусок кода обращается к локальным переменным процедуры вызывающей Find для сравнения полей элемента коллекции с локальными (и не только!) переменными, которые "текстуально не известны" в Find.
Часто оказывается, что такая запись проще и нагляднее.
Ещё раз повторяю, мы рассматриваем данное средство (относительно ООП) именно, как один из путей удаления лишнего уровня абстракции (семантически несовместимые по уровню абстракции) работы с переменными цикла. Плюс - повышается надёжность, за счёт удаления лишних мест, где можно получить ошибки через описки...
В си-шарпе этим "нечтом" стали "замыкания"...

Спасибо, теперь понятно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Понедельник, 08 Декабрь, 2008 17:00 

Зарегистрирован: Воскресенье, 09 Март, 2008 22:38
Сообщения: 372
PGR писал(а):
TAU писал(а):
Владимир Лось писал(а):
очередной РТФМ...

Вы по-русски можете объяснить?
Это означает, что научившись пользоваться поиском по интернету, у Вас не будут возникать подобные вопросы

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Понедельник, 08 Декабрь, 2008 17:09 

Зарегистрирован: Понедельник, 19 Декабрь, 2005 12:15
Сообщения: 12
РТФМ


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Понедельник, 08 Декабрь, 2008 18:27 

Зарегистрирован: Понедельник, 05 Июнь, 2006 09:49
Сообщения: 327
Откуда: Ленинград, Емельянов Алексей Николаевич
Fktrc писал(а):

По моему это называется снобизм


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Понедельник, 08 Декабрь, 2008 22:30 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
Axcel писал(а):
Fktrc писал(а):

По моему это называется снобизм

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Вторник, 09 Декабрь, 2008 07:27 

Зарегистрирован: Воскресенье, 09 Март, 2008 22:38
Сообщения: 372
Axcel писал(а):
Fktrc писал(а):

По моему это называется снобизм

Обыкновенное хамство


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Вторник, 09 Декабрь, 2008 09:13 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2461
Откуда: Россия, Томск
TAU писал(а):
Обыкновенное хамство
И лень


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Вторник, 09 Декабрь, 2008 09:31 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Владимир Лось писал(а):
Или новому поколению ссылка на гугль понятнее?
Лично я в таких случаях всегда говорю: "Гугл в помощь!"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Вторник, 09 Декабрь, 2008 20:48 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
TAU писал(а):
Обыкновенное хамство

Не понял, а что среди нас есть "афроамериканцы"? Тоды - звыняйте! ;о)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Среда, 10 Декабрь, 2008 09:00 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Давайте перестанем бодаться и вернёмся к нашим замыканиям.
На самом деле, императивные программисты (и оберонщики в том числе) тоже используют замыкания, вот только не подозревают об этом. Давайте сравним два цикла -- на Хаскелле:
Код:
let x = 5
forM_ [1..10] $ \i -> do
    print (i*x)
и Обероне:
Код:
x := 5;
FOR i:=1 TO 10 DO
    StdLog.Int(i*x); StdLog.Ln;
END;
И что мы видим? В чём-то обероновская нотация слаще (в описании самого цикла -- более привычнее, что-ли), в чём-то -- хаскельная (есть параметрический полиморфизм у функции print, хотя к данному вопросу это отношения не имеет), но по самой сути всё одинаково, разница лишь в синтаксисе.
Учитывая, что тело цикла в варианте на Хаскелле является замыканием, то можно прийти к выводу, что и на Обероне -- тоже. Разве нет?

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Среда, 10 Декабрь, 2008 09:46 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Geniepro писал(а):
... В Обероне традиционно на всё накладываются умеренные рамки -- можно делать всё что угодно, но в узких рамках, определённых опытом и привычками Вирта...
Geniepro, лично у меня к вам была некая симпатия, основанная на вашей юности и сопутствующей живости. Но вы сами -- посредством постоянной самоуверенной (с учетом явно недостаточной образованности можно и более сильный эпитет тут употребить) лжи с переходом на личности то в отношении "оберонщиков", то Вирта -- упорно опускаете свою репутацию.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Среда, 10 Декабрь, 2008 10:37 
Аватара пользователя

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

Угу. А учитывая, что некий объект из проблемной области на Хаскеле может быть смоделирован с помощью функции, то можно прийти к выводу, что наш Geniepro - тоже функция. Разве нет?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сюда?
СообщениеДобавлено: Среда, 10 Декабрь, 2008 11:22 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Илья Ермаков писал(а):
Угу. А учитывая, что некий объект из проблемной области на Хаскеле может быть смоделирован с помощью функции, то можно прийти к выводу, что наш Geniepro - тоже функция. Разве нет?

Да все мы в Матрице живём... :lol:


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

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


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

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


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

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