Автор Тема: Оберон в образовании.  (Прочитано 103301 раз)

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re:Оберон в образовании.
« Ответ #45 : Февраль 24, 2011, 12:10:36 pm »
А есть ли смысл у разделения на процедуры и функции?
Есть. То, что для функции плохо, для процедуры это может быть основной целью.
Рискну предположить, что в Оберонах ключевое слово FUNCTION не ввели для того, чтобы "не плодить сущности". Но сущностей от этого меньше не стало: процедуры - это процедуры, а функции - это функции, и смешивать эти понятия на мой взгляд не стОит.

PS: За одно, не понадобится вводить корявый термин proper procedure (обычные процедуры).

DIzer

  • Гость
Re:Оберон в образовании.
« Ответ #46 : Февраль 24, 2011, 02:00:15 pm »

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

PS: За одно, не понадобится вводить корявый термин proper procedure (обычные процедуры).

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

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re:Оберон в образовании.
« Ответ #47 : Февраль 24, 2011, 03:20:37 pm »
Так покажите это! Для меня достаточно будет если вы покажете ..."
Не понял, что показать-то? Процедура - это обработка данных, которую необходимо выполнить. Функция - это значение, которое необходимо получить/вычислить. В процессе своей работы функция не должна изменять глобальное (по отношению к данной функции) состояние программы.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re:Оберон в образовании.
« Ответ #48 : Февраль 24, 2011, 03:29:24 pm »
Так покажите это! Для меня достаточно будет если вы покажете ..."
Не понял, что показать-то? Процедура - это обработка данных, которую необходимо выполнить. Функция - это значение, которое необходимо получить/вычислить. В процессе своей работы функция не должна изменять глобальное (по отношению к данной функции) состояние программы.

Не проще ли просто стремится к тому, чтобы процедуры/функции не изменяли что-то глобальное? Тогда не потребуется столь нечеткое разделение на процедуры и функции. И OUT-параметры - тоже не потребуются :)

DIzer

  • Гость
Re:Оберон в образовании.
« Ответ #49 : Февраль 24, 2011, 03:41:38 pm »
Так покажите это! Для меня достаточно будет если вы покажете ..."
Не понял, что показать-то? Процедура - это обработка данных, которую необходимо выполнить. Функция - это значение, которое необходимо получить/вычислить. В процессе своей работы функция не должна изменять глобальное (по отношению к данной функции) состояние программы.
То есть П.. отличается от Ф. требованием "В процессе своей работы функция не должна изменять глобальное (по отношению к данной функции) состояние программы."?

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re:Оберон в образовании.
« Ответ #50 : Февраль 24, 2011, 03:56:40 pm »
Тогда не потребуется столь нечеткое разделение на процедуры и функции.
А чего тут нечеткого? void - процедура, не void - функция.

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re:Оберон в образовании.
« Ответ #51 : Февраль 24, 2011, 04:00:18 pm »
Не проще ли просто стремится к тому, чтобы процедуры/функции не изменяли что-то глобальное? Тогда не потребуется столь нечеткое разделение на процедуры и функции.
Ситуация мне представляется забавной. Попробую объяснить, прибегнув к аналогии.
Вот, представьте, что я над порогом своего дома натянул незаметную верёвочку на уровне колена.  :)  И всех своих знакомых, которых я пригласил в гости, я заботливо оповестил, что мол будьте осторожны, не упадите когда будете входить, у меня там натянута верёвочка.

И когда кто-нибудь всё-таки запнётся и расквасит себе нос, я встану над ним и запричитаю: "Ну, что же вы так не внимательны. Осторожнее надо быть, ведь же я вас предупреждал!"

Проблему, на мой взгляд, можно решить введя в язык следующие правила:
1. Внутри функции глобальные (по отношению к ней) переменные доступны только для чтения.
2. Параметры, передаваемые в функцию по ссылке, доступны внутри функции только для чтения.
3. Внутри функции запрещено использовать вызов процедур.

И хватит благостной говорильни о вреде побочного эффекта  :)

DIzer

  • Гость
Re:Оберон в образовании.
« Ответ #52 : Февраль 24, 2011, 04:04:32 pm »
А чего тут нечеткого? void - процедура, не void - функция.
То есть разница между ними есть просто отражение различий в определении интерфейса?

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re:Оберон в образовании.
« Ответ #53 : Февраль 24, 2011, 04:04:51 pm »
То есть П.. отличается от Ф. требованием "В процессе своей работы функция не должна изменять глобальное (по отношению к данной функции) состояние программы."?
И это тоже. Но не только.

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re:Оберон в образовании.
« Ответ #54 : Февраль 24, 2011, 04:11:40 pm »
2DIzer
"void", "не void" - забудьте про C. В нём процедуры отсутствуют как класс. Поэтому там никто не решится избавить функции от побочного эффекта.

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Оберон в образовании.
« Ответ #55 : Февраль 24, 2011, 04:18:21 pm »
Хм. А быть может подойти к дело более общо?

Что есть функция или процедура? Это есть кусок кода который что-то делает. У этого куска кода есть вход и выход. Все. Таким образом нужно явно указать что этому куску подаем на вход, и что будем принимать на выходе. Именно явно, а не как сейчас.

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

Вот предположим у нас эта гм... ну пусть процедура (далее псевдокод):
proc foo require
    arr : Array of Int (read, write),
    log : Logger (write),
    res : Boolean (write) := False;
begin
    for I in range(arr) do
        arr(I) := arr(I)+1;
        log.writeln(arr(I));
    end
    res := True;
end foo

Ну и соответственно использование:
res : Boolean;
my_log : SysLogger;
my_array : Array (1..100) of Int;
...
fooCall is foo with my_log (write), res (write), my_array (read, write);
do fooCall;
Многословно? Возможно, но это лишь псевдокод, так понятней. Синтаксис штука вторичная, можно допилить.
Важно что мы и в спецификации и при использовании ЯВНО указываем до чего может данная процедура получить доступ. И какой именно доступ. Частичная конкретизация доступа тоже возможна:
my_log : SysLogger;
fooSysLog is foo with my_log (write);
..
foo1 is fooSysLog with res1 (write), my_array1(read, write);
do foo1;
foo2 is fooSysLog with res2 (write), my_array1(read, write);
do foo2;
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

DIzer

  • Гость
Re:Оберон в образовании.
« Ответ #56 : Февраль 24, 2011, 04:24:38 pm »
2DIzer
"void", "не void" - забудьте про C. В нём процедуры отсутствуют как класс. Поэтому там никто не решится избавить функции от побочного эффекта.
Отсутствует слово Procedure? но там и Function отстутствует,  разве нет?

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Оберон в образовании.
« Ответ #57 : Февраль 24, 2011, 04:27:12 pm »
Кстати, если уж быть совсем последовательным, то и процедура foo будет писана как-то так:
proc foo require
    arr : Array of Int (read, write),
    log : Logger (write),
    res : Boolean (write) := False;
begin
    for I in range(arr) do
        arr(I) := arr(I)+1;
        do log.writeln with arr(I) (read);
    end
    res := True;
end foo
В общем, на счет синтаксиса надо ещё подумать будет :-) (в частности у меня тут непонятно -- позиционная запись параметров идет или нет, если позиционная, то в предыдущем сообщении в коде у меня очевидно ошибка, если именная, то где имена? хотя можно конечно отбрехаться, мол в примере типизация дает однозначную трактовку что куды пихать, в противном случае компилятор ругнётся :-) )
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re:Оберон в образовании.
« Ответ #58 : Февраль 24, 2011, 04:30:33 pm »
Проблему, на мой взгляд, можно решить введя в язык следующие правила:
1. Внутри функции глобальные (по отношению к ней) переменные доступны только для чтения.
2. Параметры, передаваемые в функцию по ссылке, доступны внутри функции только для чтения.
3. Внутри функции запрещено использовать вызов процедур.

ИМХО такое правило не будет работать, потому что абсолютно непрактично переделывать 20 функций в процедуры как только самая "нижняя" функция превратится в процедуру. В этом смысле ограничение на уровне конкретных аргументов (просто const или как Алексей написал) более гранулярно и гибко. А функция/процедура - должна быть одной сущностью.

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re:Оберон в образовании.
« Ответ #59 : Февраль 24, 2011, 04:34:10 pm »
Не проще ли просто стремится к тому, чтобы процедуры/функции не изменяли что-то глобальное?
Если процедура не меняет ничего глобального (в том числе -- и ввод/вывод), то толку от неё нет, только процессорное время зря тратит. Зачем она нужна?
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…