OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Среда, 24 Апрель, 2024 04:56

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




Начать новую тему Ответить на тему  [ Сообщений: 197 ]  На страницу Пред.  1 ... 6, 7, 8, 9, 10  След.
Автор Сообщение
 Заголовок сообщения: Re: Об одной задаче из ЕГЭ
СообщениеДобавлено: Среда, 01 Август, 2007 22:20 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Илья Ермаков писал(а):
Geniepro писал(а):
ЗЫ. Этот В.В. Прохоров описывал ещё и ФЯ PROLAN/F - этакий микро-Хаскелл, жаль, я потерял тот номер... :о(
А в интернет-архивах нет?

Пока не нашёл... Архив издательства этого журнала начинается только с 2002 г., более старых нет...
Нашёл ссылки на этот язык в учебных программах ИММ УрО РАН:

http://pmf.vidicor.ru/School/index.htm

Прохоров В.В., Прохорова М.Ф. Система функционального программирования на языке PROLAN/F // Проблемы теоретической и прикладной математики. Информационные материалы. Свердловск: УрО РАН, 1990. С.60

Судя по всему, интересная книга, но не в открытом доступе:
Школьник и компьютер - учимся друг у друга
Год: 1993
УДК: 519.68

Ну, вообще-то я догадываюсь, откуда идут корни этого PROLAN/F - очень похожий на этот язык псевдокод был описан в книге Питера Хендерсона "Функциольнальное программирование. Применение и реализация"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Об одной задаче из ЕГЭ
СообщениеДобавлено: Среда, 01 Август, 2007 22:37 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
ScrollLock писал(а):
Но вообще-то такие вещи вызываются ассоциации с языком BrainF**k (не хочу никого обидеть, но реально трудно воспринимать)

Не, ну не скажите... В Prolan/M чётко видно, что на что меняется, а в птичьем брейнфаке голову сломать можно... :о))

Цитата:
Ясное дело, но увы, CMP/Jxx вместе с коротким и длинными JMP в больших программах применять чего-то не тянет

А Вы знаете, для реализации функциональности оператора IF-THEN-ELSE никакие CMP/Jxx не нужны... ;о)

Краткое введение в лямбда-исчисление


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Об одной задаче из ЕГЭ
СообщениеДобавлено: Четверг, 02 Август, 2007 00:36 

Зарегистрирован: Среда, 01 Август, 2007 00:13
Сообщения: 162
Geniepro писал(а):
А Вы знаете, для реализации функциональности оператора IF-THEN-ELSE никакие CMP/Jxx не нужны... ;о)

Ну функциональные языки - вещь весьма экзотическая и "на новенького" вполне себе "бреинфачная" (хотя некоторые вещи там пишутся нагляднее). А CMP/Jxx нужны, но в этом случае к ним ещё добавится PUSH...CALL...RET (для рекурсии).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Об одной задаче из ЕГЭ
СообщениеДобавлено: Четверг, 02 Август, 2007 10:13 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
ScrollLock писал(а):
А CMP/Jxx нужны, но в этом случае к ним ещё добавится PUSH...CALL...RET (для рекурсии).

Ну хорошо, вот простейший вариант функционального варианта IF-THEN-ELSE:
Код:
iff   (cond, thn, els) = cond (thn, els)

true  (thn, els) = thn

false (thn, els) = els

Здесь функция true принимает два параметра, возвращает первый, второй игнорирует;
функция false принимает два параметра, возвращает второй, а первый - игнорирует.
Функция iff является функцией высшего порядка (ФВП) - принимает в качестве первого параметра другую функцию, которую тут же вызывает, передав ей свои второй и третий параметры...

Например, в следующей программке:
Код:
a = iff (true,  1, 2)
b = iff (false, 1, 2)

a будет равна 1, а b, соответственно, 2...

Ну где тут CMP/Jxx ??? Нету их! :о))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Об одной задаче из ЕГЭ
СообщениеДобавлено: Четверг, 02 Август, 2007 20:31 

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1030
По семантике IF cначала должно проверяться условие, а не исполняться ветка.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Об одной задаче из ЕГЭ
СообщениеДобавлено: Четверг, 02 Август, 2007 20:55 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
GUEST писал(а):
По семантике IF cначала должно проверяться условие, а не исполняться ветка.

Какая ветка? Вы про энергичные вычисления? Ну так чистое ФП обычно лениво, и какое-либо выражение вычисляется только когда оно становится нужным. Сначала условие, а затем - нужная ветка, всё верно... ;о)

Кстати, в том же Обероне операции AND, OR тоже ленивы - второй аргумент вычисляется только при необходимости...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Об одной задаче из ЕГЭ
СообщениеДобавлено: Четверг, 02 Август, 2007 21:19 
Модератор
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Об одной задаче из ЕГЭ
СообщениеДобавлено: Четверг, 02 Август, 2007 22:38 

Зарегистрирован: Среда, 01 Август, 2007 00:13
Сообщения: 162
Geniepro писал(а):
Кстати, в том же Обероне операции AND, OR тоже ленивы - второй аргумент вычисляется только при необходимости...

Интересно, в каком порядке компилятор обходит IF - слева направо или справа налево? Это прописано в спецификации? А то будет стоять какая-то функция, которая что-то делает, а он её раз и отключит... Вот и "грабли"...

Илья Ермаков писал(а):
Т.е. полагаясь на гарантированную ленивость, мы можем писать более лаконичные выражения (в частности, условия циклов).

В некоторых случаях это будет трюкачеством в стиле игр с префиксной-постфиксной формами операторов инкремента и декремента в Си...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Об одной задаче из ЕГЭ
СообщениеДобавлено: Четверг, 02 Август, 2007 22:47 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Причём тут трюкачество, сокращённое вычисление логических выражений - стандарт в современных языках.
Если в выражении (A & B) A дало FALSE, то B не вычисляется, т.к. его значение не влияет на результат выражения.
Если в выражении (A OR B) A дало TRUE, то B не вычисляется.
Это позволяет красиво записывать условия, к примеру, в линейном поиске:
WHILE (list # NIL) & (list.x # 10) DO list := list.next END.
С математической точки зрения грамотнее, т.е. если первый операнд осмысленен и целиком определяет результат операции, то неосмысленность второго операнда не оказывает никакого влияния на осмысленность операции в целом.

Иначе пришлось бы писать:
WHILE (list # NIL) & ~found DO
IF list.x = 10 THEN
found := TRUE
ELSE
list := list.next
END
END, потом посмотреть, плюнуть - и начать воротить цикл с BREAK...

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Об одной задаче из ЕГЭ
СообщениеДобавлено: Пятница, 03 Август, 2007 00:08 

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1030
Geniepro писал(а):
GUEST писал(а):
По семантике IF cначала должно проверяться условие, а не исполняться ветка.

Какая ветка? Вы про энергичные вычисления? Ну так чистое ФП обычно лениво, и какое-либо выражение вычисляется только когда оно становится нужным. Сначала условие, а затем - нужная ветка, всё верно... ;о)

Кстати, в том же Обероне операции AND, OR тоже ленивы - второй аргумент вычисляется только при необходимости...

Нет не про вычисление, а про оператор IF ( т.е. о функции высокого порядка, конечно). Как бы она передала аргумент, не вычислив его? Отсюда и замечание.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Об одной задаче из ЕГЭ
СообщениеДобавлено: Пятница, 03 Август, 2007 00:11 
Модератор
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Об одной задаче из ЕГЭ
СообщениеДобавлено: Пятница, 03 Август, 2007 01:01 

Зарегистрирован: Среда, 01 Август, 2007 00:13
Сообщения: 162
Илья Ермаков писал(а):
Причём тут трюкачество, сокращённое вычисление логических выражений - стандарт в современных языках.

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

А если функций ввода-вывода не запихивать в сложные выражения - тогда конечно не трюкачество :). Хотя что-то в стиле (имя функции и тип данных - условные)
IF OpenFile("file") # NIL THEN
...
ELSE
...
END
так и напрашивается (частенько такое встречается) - функция-то одна.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Об одной задаче из ЕГЭ
СообщениеДобавлено: Пятница, 03 Август, 2007 01:32 
Модератор
Аватара пользователя

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

IF OpenFile("file") # NIL THEN
- а тут смысла нет. Всё равно полученный объект надо использовать, а потому Вы будете сначала присваивать его чему-либо.
И OpenFile, вообще говоря, можно в конктексте прикладного кода считать функцией без побочных эффектов. Для вашего модуля от факта открытия файла ничего не меняется...

А вообще, об этом думают разработчики функций. В КП никогда не описывают функцию с побочными эффектами. Если они есть, то возврат значения идёт через OUT-параметр.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Об одной задаче из ЕГЭ
СообщениеДобавлено: Пятница, 03 Август, 2007 01:53 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Илья Ермаков писал(а):
В КП никогда не описывают функцию с побочными эффектами. Если они есть, то возврат значения идёт через OUT-параметр.

Зачем так категорично? Вы не используете, а кто-то использует. Язык ведь такое не запрещает


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Об одной задаче из ЕГЭ
СообщениеДобавлено: Пятница, 03 Август, 2007 09:41 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
ScrollLock писал(а):
Интересно, в каком порядке компилятор обходит IF - слева направо или справа налево? Это прописано в спецификации? А то будет стоять какая-то функция, которая что-то делает, а он её раз и отключит... Вот и "грабли"...

Функция, которая что-то делает - это процедура с побочными эффектами.
Хороший стиль программирования требует запрета на вызов подобных процедур внутри условия цикла или IF. Следуйте этому запрету - и граблей не будет... :о)

Илья Ермаков писал(а):
Причём тут трюкачество, сокращённое вычисление логических выражений - стандарт в современных языках.

Кстати, в Аде есть оба варианта - и энергичные and/or, и ленивые and then/or else.

Вообще, вот это меня удивляет в поздних виртовских языках - Модуле-2 и Обероне.
Что за такая мания к сокращению набора ключевых слов - & вместо AND, ~ вместо NOT, даже нестандартный # вместо <> или /= или |= ... Зачем такие сокращения? Какая от них выгода? Только ухудшение читабельности...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Об одной задаче из ЕГЭ
СообщениеДобавлено: Пятница, 03 Август, 2007 09:50 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
GUEST писал(а):
Нет не про вычисление, а про оператор IF ( т.е. о функции высокого порядка, конечно). Как бы она передала аргумент, не вычислив его? Отсюда и замечание.

А в чём проблема-то? Как приняла, так и передала - зачем вычислять то выражение, результат которого не понадобится?
Фактически же из функции в функцию передаются не сами выражения, а лишь ссылки на них. Когда выражение понадобится, то оно вычисляется по этой ссылке, вот и всё...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Об одной задаче из ЕГЭ
СообщениеДобавлено: Пятница, 03 Август, 2007 10:22 
Модератор
Аватара пользователя

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


А напрасно не запрещает :-)
Просто в учебных курсах, по которым учат основные участники Информатики-21, это сразу говорится ученикам, и ещё грозится пальчиком: "Ай-яй, если нарушать - то по рукам..." :-) Отсюда и такая категоричность...

Всё идёт этак поэтапно. Когда-то на словах запретили GOTO/BREAK, а фактически его оставляли в языках. Но и то, под влиянием пропаганды, использование по крайней мере GOTO уменьшилось до терпимого уровня. Потом исключили из некоторых особо хороших языков вообще. Основное внимание "словесного внушения" пошло уже на более тонкие моменты типа побочных эффектов :-) А там не за горой и их компиляторный контроль :-)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Об одной задаче из ЕГЭ
СообщениеДобавлено: Пятница, 03 Август, 2007 11:01 

Зарегистрирован: Среда, 01 Август, 2007 00:13
Сообщения: 162
Илья Ермаков писал(а):
А вообще, об этом думают разработчики функций. В КП никогда не описывают функцию с побочными эффектами. Если они есть, то возврат значения идёт через OUT-параметр.

Илья Ермаков писал(а):
А напрасно не запрещает. Просто в учебных курсах, по которым учат основные участники Информатики-21, это сразу говорится ученикам, и ещё грозится пальчиком: "Ай-яй, если нарушать - то по рукам...

Я совершенно согласен, что некоторые случаи употребления этих функций в IF-ах (особенно по несколько штук)- "грабли". Но запрещать функции действия - это уже экстремизм, из языка их не исключишь: иначе как обращаться к Windows API или к множеству графических библиотек (напр, OpenGL)? А ведь Windows и OpenGL - это продукты мирового класса. Очевидно, люди решили не городить указателей, там где это излишне (это я про возврат значения через OUT-параметр).
А насчёт остальных не очень структурных вещей: по читаемости и нужности получается ряд break>continue>goto. В Обероне цикл LOOP способен избавить от соблазна "лепить" goto в некоторых случах (типа поиска элемента в двухмерном массиве).
P.S. А про открытие файла - у меня просто перед глазами был вот такой код - в нём вроде бы "граблей" не видно (кстати, очень часто встречается)
Код:
if ( (fp = fopen(filename, "rt")) == NULL)
{
  printf("Error!");
  return 1;
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Об одной задаче из ЕГЭ
СообщениеДобавлено: Пятница, 03 Август, 2007 13:47 
Модератор
Аватара пользователя

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

Обычно вызовы WinAPI и внешних не-ООП библиотек остаются только на самом нижнем уровне, тут же оборачиваются и закрываются собственными высокоуровневыми интерфейсами. Естественно, на низком уровне взаимодействия с окружением без таких поблажек не обойтись, как и без SYSTEM. Речь идёт об основных частях систем.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Об одной задаче из ЕГЭ
СообщениеДобавлено: Пятница, 03 Август, 2007 15:16 

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


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

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


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

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


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

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