Автор Тема: [Oberon] Опционально возвращаемое значение.  (Прочитано 6083 раз)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
В ряде случаев функция возвращает значение которое, вообще говоря, опционально. То есть вызывающему это значение может быть нужно, а может быть не нужно (то есть там не лежит флаг о успешности операции, а основной профит от функции это её побочный эффект-действие, плюс, возможно, какое-то количество возвращаемых параметров через аргументы).

Как это культурней организовать в Обероне? Оберон не позволяет вызов такой функции оформлять в виде statement'a, только в виде expression'a. А expression у нас будет либо в assignment, либо в IF либо в CASE либо в WHILE. Что не здорово.

Просто городить две версии этой функции с разными названиями? Типа FooProc, FooFunc?
Y = λf.(λx.f (x x)) (λx.f (x x))

kkkk

  • Full Member
  • ***
  • Сообщений: 135
    • Просмотр профиля
Re: [Oberon] Опционально возвращаемое значение.
« Ответ #1 : Ноябрь 07, 2013, 08:10:34 pm »
Для начала надо бы выяснить, для чего это сделано. Есть идеи?

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [Oberon] Опционально возвращаемое значение.
« Ответ #2 : Ноябрь 07, 2013, 08:18:49 pm »
Для начала надо бы выяснить, для чего это сделано. Есть идеи?

Обычно такое вылезает при написании биндингов. Например такая штука используется чтобы можно было делать цепочки вызовов в том, нативном языке для данной либы: Foo.Bar().Boo().Baz() грубо говоря. Или foo(bar(str, opt2),opt1); При этом и одиночный вызов foo(str,opt) естественно имеет смысл.
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: [Oberon] Опционально возвращаемое значение.
« Ответ #3 : Ноябрь 07, 2013, 08:43:24 pm »
Бывает что просто нужно вызвать чужую функцию, а возвращаемый результат не интересует.
Как сказал выше valexey, интересуют побочные эффекты (т.е. типа это процедура)
Это не часто встречается, но таки довольно удобно.

Даже при возвращаемом булево.

Например в 1С у структур есть метод "Свойство(<ИмяСвойства>, <Значение>): Булево"
Он позволяет проверить наличие свойства в структуре по его имени и заодно получить значение этого свойства.

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

МояСтруктура = Новый Структура("Поле1, Поле2");
МояСтруктура.Поле1 = 10;
...
// получаем значения
// таких строк может быть много
// и в нашем алгоритме, к примеру
// Значение должно остаться равным "Неопределено"
// если такого свойства нет
Значение1 = Неопределено;
МояСтруктура.Свойство("Поле1", Значение1);
Значение2 = Неопределено;
МояСтруктура.Свойство("Поле2", Значение2);

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: [Oberon] Опционально возвращаемое значение.
« Ответ #4 : Ноябрь 07, 2013, 08:45:16 pm »
Для начала надо бы выяснить, для чего это сделано. Есть идеи?

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

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [Oberon] Опционально возвращаемое значение.
« Ответ #5 : Ноябрь 07, 2013, 08:51:59 pm »
Замечу, что в Модуле-3 таки можно игнорировать возвращаемое значение. Но там это надо делать явным образом:
An EVAL statement has the form:

    EVAL e

where e is an expression. The effect is to evaluate e and ignore the result. For example:

    EVAL Thread.Fork(p)

В принципе это улучшает если не читаемость, то документируемость кода. В отсутствии IDE видно что это не просто так процедура вызывается, а она еще может и вернуть что-то полезное. Соответственно можно прикинуть пути модификации программы.

Но у меня то вопрос не о том как это выпилить или модифицировать в языке, у меня сугубо прикладной вопрос - как мне культурней работать с такими функциями? Например при написании биндингов. Как это дело в Обероне оформлять?
Y = λf.(λx.f (x x)) (λx.f (x x))

kkkk

  • Full Member
  • ***
  • Сообщений: 135
    • Просмотр профиля
Re: [Oberon] Опционально возвращаемое значение.
« Ответ #6 : Ноябрь 07, 2013, 09:00:58 pm »
Если для импорта чужеродных функций, то действительно неважно зачем это было сделано Виртом.
Как насчет SYSTEM.EVAL() ?

kkkk

  • Full Member
  • ***
  • Сообщений: 135
    • Просмотр профиля
Re: [Oberon] Опционально возвращаемое значение.
« Ответ #7 : Ноябрь 07, 2013, 09:06:57 pm »
Также можно считать, что биндинги относятся к расширизмами (а как иначе они включены в язык?), и для них действуют несколько иные правила

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [Oberon] Опционально возвращаемое значение.
« Ответ #8 : Ноябрь 07, 2013, 09:09:43 pm »
Также можно считать, что биндинги относятся к расширизмами (а как иначе они включены в язык?), и для них действуют несколько иные правила
Ненене, я не спрашиваю как именно мне писать биндинг. Я спрашиваю как мне такую забинженную функцию оформить для конечного пользоателя-программиста, который в своих модулях конечно же никакого SYSTEM использовать не будет, а будет использовать мой готовый биндинг.

Как это культурней и удобней сделать? Развалить на две функции? BooProc, BooFunc?
Y = λf.(λx.f (x x)) (λx.f (x x))

kkkk

  • Full Member
  • ***
  • Сообщений: 135
    • Просмотр профиля
Re: [Oberon] Опционально возвращаемое значение.
« Ответ #9 : Ноябрь 07, 2013, 10:06:00 pm »
Понял. Наверно единого приемлемого решения здесь нет, в каких-то случаях - две функции, в каких-то - внешняя переменная (все равно с параллельностью Оберон не дружит), в каких-то - таки обязательное возвращаемое значение.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [Oberon] Опционально возвращаемое значение.
« Ответ #10 : Ноябрь 07, 2013, 10:08:39 pm »
Понял. Наверно единого приемлемого решения здесь нет, в каких-то случаях - две функции, в каких-то - внешняя переменная (все равно с параллельностью Оберон не дружит), в каких-то - таки обязательное возвращаемое значение.
Ну, с параллельностью мы его еще подружим :-)

Спасибо.
Y = λf.(λx.f (x x)) (λx.f (x x))

Vartovyj

  • Full Member
  • ***
  • Сообщений: 197
    • Просмотр профиля
Re: [Oberon] Опционально возвращаемое значение.
« Ответ #11 : Ноябрь 08, 2013, 06:56:16 am »
Foo(): void
?

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: [Oberon] Опционально возвращаемое значение.
« Ответ #12 : Ноябрь 08, 2013, 03:41:25 pm »
An EVAL statement has the form:

...а вот если бы были шаблоны, то можно было бы написать:
PROCEDURE EVAL<T>(x: T);
END EVAL;

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [Oberon] Опционально возвращаемое значение.
« Ответ #13 : Ноябрь 08, 2013, 04:13:20 pm »
An EVAL statement has the form:

...а вот если бы были шаблоны, то можно было бы написать:
PROCEDURE EVAL<T>(x: T);
END EVAL;

Да, дженериков не достаточно :-)
Y = λf.(λx.f (x x)) (λx.f (x x))