OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 19 Март, 2024 05:19

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




Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Побочные эффекты функций
СообщениеДобавлено: Понедельник, 26 Декабрь, 2011 10:51 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Тема отделена отсюда: viewtopic.php?p=68903#p68903

alexus писал(а):
Что мешает сделать этапы логическими функциями? Тогда было бы просто...
Код:
IF <этап0> AND <этап1> AND <этап3> ... THEN....


Мешает, пожалуй, только правило "Функции не должны иметь побочных эффектов"... В случае локальных фукнций, специально введённых для такого оформления поведения, можно, конечно, на это забить.
Но функциональщики будут кусать за пятки :)

Я бы придерживался более слабого правила - функция с побочным эффектом может быть только локальной.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конструкция AND THEN?
СообщениеДобавлено: Понедельник, 26 Декабрь, 2011 13:01 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Я для себя с некоторых пор стал различать функции и процедуры-функции (в собственном смысле).
Не то чтобы я это где-то вычитал. Этакое изобретение моей больной фантазии :)
Отличаются они тем, что результат работы функции - это собсна то, что она возвращает. (ну и без побочных эффектов ессесна)
А результат работы процедуры-функции как у обычной процедуры, с той лишь разницей, что она еще сообщает (возвращая булево), сделала ли она то, что от нее требовалось.

Трудность тут в том что и та и другая могут возвращать булево. Я в своем коде такие случаю четко различаю. А вот кодер со стороны может не врубиться.

p.s. А вообще понятие побочного эффекта по большому счету и на процедуры должно распространяться.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конструкция AND THEN?
СообщениеДобавлено: Понедельник, 26 Декабрь, 2011 13:16 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Еще интересная штука....
Если я начну в вспоминать какая эволюция и трансформация понятий "процедура" и "функция" в моей голове происходила (с момента знакомства с программированием), забавный материальчик для студентов психфака получится :lol:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конструкция AND THEN?
СообщениеДобавлено: Понедельник, 26 Декабрь, 2011 14:01 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Илья Ермаков писал(а):
Я бы придерживался более слабого правила - функция с побочным эффектом может быть только локальной.
То есть, по Вашему, лишь глобальные функции должны быть без побочного эффекта? В этом случае получается вот что. Так как глобальные функции в общем случае могут содержать в себе вызовы других функций (в том числе и локальных!), то отсутствие побочного эффекта для них не гарантируется.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конструкция AND THEN?
СообщениеДобавлено: Понедельник, 26 Декабрь, 2011 20:18 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Локальная функция называется локальной потому, что работает с локальными данными.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конструкция AND THEN?
СообщениеДобавлено: Вторник, 27 Декабрь, 2011 19:46 

Зарегистрирован: Воскресенье, 01 Ноябрь, 2009 05:13
Сообщения: 2046
ilovb писал(а):
...
p.s. А вообще понятие побочного эффекта по большому счету и на процедуры должно распространяться.
Типа как здесь описано? Или что-то более глубинное есть?..


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конструкция AND THEN?
СообщениеДобавлено: Вторник, 27 Декабрь, 2011 21:17 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
ilovb писал(а):
p.s. А вообще понятие побочного эффекта по большому счету и на процедуры должно распространяться.
Если процедура, которая не обязана возвращать никакого значения, ещё и не будет обладать "побочным эффектом", то зачем она вообще тогда нужна? То, что для функций является побочным эффектом, для процедур наоборот, является их полезным действием, то есть тем, ради чего процедура и пишется.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конструкция AND THEN?
СообщениеДобавлено: Вторник, 27 Декабрь, 2011 22:14 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
То, что процедура изменяет, должно быть в списке ее параметров


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конструкция AND THEN?
СообщениеДобавлено: Вторник, 27 Декабрь, 2011 22:20 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Я просто хочу сказать, что если речь заходит о побочных эффектах, то есть два варианта:
1. Их нет (функцианальщина)
2. Их есть (императивщина)

Причем, во втором случае функции вообще исчезают в их изначальном смысле. А есть только процедура, которая кладет что-то в AX (и т.д.)

Ну, то бишь:

PROCEDURE foo(VAR A: INTEGER);
BEGIN
A := A * 2;
END;

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

PROCEDURE foo(A): INTEGER;
BEGIN
RETURN A * 2;
END;

Не знаю короче как еще выразиться. В общем, в императивном языке требовать от функций чистоты большого смысла не имеет. Это дело вкуса.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конструкция AND THEN?
СообщениеДобавлено: Среда, 28 Декабрь, 2011 05:58 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
ilovb писал(а):
То, что процедура изменяет, должно быть в списке ее параметров

По Вашему получается, что процедура без параметров - это зло: внутри себя что-то мутит, а в параметрах результат не "светит". Так можно далеко зайти в своих рассуждениях. Например, прийти к выводу, что нужно убрать из КП команды, положить их на полку где-то между GOTO и передачей параметров по имени. :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конструкция AND THEN?
СообщениеДобавлено: Среда, 28 Декабрь, 2011 09:21 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Пихать все в параметры или не пихать зависит от контекста, степени понятности кода, степени взаимопонимания в коллективе и много еще от чего. Все это дело вкуса.
Если чистые процедуры и функции это стиль вашей архитектуры, то используйте по возможности только их.
Если из названия/контекста очевидно какие переменные будут изменены при выполнении процедуры, то убирайте их из параметров нафик (тем более во вложенных процедурах)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конструкция AND THEN?
СообщениеДобавлено: Среда, 28 Декабрь, 2011 09:25 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
И еще раз повторю. Либо мы разрешаем побочные эффекты и для процедур и для функций, либо запрещаем.

В императивном языке между процедурой и функцией разница только психологическая :D


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конструкция AND THEN?
СообщениеДобавлено: Четверг, 29 Декабрь, 2011 07:32 
Модератор
Аватара пользователя

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конструкция AND THEN?
СообщениеДобавлено: Четверг, 29 Декабрь, 2011 07:58 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Илья Ермаков писал(а):
есть железное правило
Точнее, "бумажное правило".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конструкция AND THEN?
СообщениеДобавлено: Четверг, 29 Декабрь, 2011 08:54 
Модератор
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конструкция AND THEN?
СообщениеДобавлено: Четверг, 29 Декабрь, 2011 08:59 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Илья Ермаков писал(а):
"Писанное кровью" :)
Согласен :) . Причём, цензор сидит не в компиляторе, а в голове.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Побочные эффекты функций
СообщениеДобавлено: Четверг, 29 Декабрь, 2011 09:06 
Модератор
Аватара пользователя

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

Есть проверки "первого рода" - это то, что есть вероятность нарушить неосознанно (допустить ошибку по невнимательности). Очень важно это проверять. Особенно, если вероятность ошибки высока, а искать трудно (как порча памяти. А уже инициализация переменных даёт ошибку в логике, при этом легко обнаружимую; поэтому на весах "ранее обнаружение | эффективность" у Вирта перевесило второе).
Есть проверки "второго рода" - того, что неосознанно сделать неправильно никак нельзя. Нельзя неосознанно, из-за "усталости", сделать функцию с побочным эффектом... Поэтому это уже не столь критично. Хотя со временем эволюция. видимо, будет в сторону введения подобных правил в язык. Как и, например, индентации (что Info21 включил в школьную сборку).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Побочные эффекты функций
СообщениеДобавлено: Четверг, 29 Декабрь, 2011 10:35 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Илья Ермаков писал(а):
Нельзя неосознанно, из-за "усталости", сделать функцию с побочным эффектом...
Да. Но можно это сделать осознанно, поддавшись какому-нибудь соблазну :!:
Я считаю, что в таком случае компилятор должен надавать по рукам. :mrgreen:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Побочные эффекты функций
СообщениеДобавлено: Четверг, 29 Декабрь, 2011 13:26 

Зарегистрирован: Четверг, 23 Апрель, 2009 18:01
Сообщения: 219
Цитата:
Отсюда и правило проецируется на функции.

Большинство функций с побочным эффектом возвращают результат. "Побочный эффект" - результат изменчивости внешнего мира. Самый простой вариант - это когда успех в виде флага возвращается.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Побочные эффекты функций
СообщениеДобавлено: Четверг, 29 Декабрь, 2011 13:41 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Илья Ермаков писал(а):
... в идеологии Оберона между выражениями и действиями есть твёрдая граница (в отличие от Си), которая нигде не нарушается.
Наконец, есть железное правило - вычисление выражения не должно давать побочных эффектов.
Отсюда и правило проецируется на функции...


Я с вами согласен. Но только частично.
Да, в Обероне действительно выражения не предназначены для выполнения последовательности действий.
Но! Ничто не мешает такую последовательность организовать, т.к. выражение вычисляется лениво.
Не нравится, что операторы в одну строку записаны? Ну пишите их вертикально.
Если пораскинуть мозгами, то быстро понимаешь, что проблема заключается в своей собственной подкорке.
И естественно выходит, что ваше "железное правило" мыльный пузырь. (я тут конечно императивный язык имею ввиду)
И ничего уже не проецируется на функции...

Попробуйте доказать обратное! Нет абсолютно никакого смысла запрещать в выражениях побочные эффекты. Забудьте вы вообще про выражения и про само слово "выражение". Назовите для себя это каким нибудь "оператор секьюенс уис гуард" и сразу на душе станет легче. :D

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

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

Я вот сейчас на досуге почитываю SICP - это самая сильная книга по программированию по-моему.
Парадоксально, что все, даже самые изысканные примеры можно переписать на CP. Я даже рисую себе в голове такие программы когда читаю примеры на Схеме. Все можно. И тоже будет красиво гибко и расширяемо.

НО! Цена усилий несоизмерима!

Попробуйте переписать ради интереса пример из книги по работе с дробями. И придать ту же гибкость.
У вас это легко получится. Я не сомневаюсь. А потом попробуйте то-же самое в первый раз закодить на Схеме... Ну и далее "но комментс" как говорится!...


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

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


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

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


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

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