Oberon space
General Category => Общий раздел => Тема начата: valexey_u от Ноябрь 07, 2013, 07:58:50 pm
-
В ряде случаев функция возвращает значение которое, вообще говоря, опционально. То есть вызывающему это значение может быть нужно, а может быть не нужно (то есть там не лежит флаг о успешности операции, а основной профит от функции это её побочный эффект-действие, плюс, возможно, какое-то количество возвращаемых параметров через аргументы).
Как это культурней организовать в Обероне? Оберон не позволяет вызов такой функции оформлять в виде statement'a, только в виде expression'a. А expression у нас будет либо в assignment, либо в IF либо в CASE либо в WHILE. Что не здорово.
Просто городить две версии этой функции с разными названиями? Типа FooProc, FooFunc?
-
Для начала надо бы выяснить, для чего это сделано. Есть идеи?
-
Для начала надо бы выяснить, для чего это сделано. Есть идеи?
Обычно такое вылезает при написании биндингов. Например такая штука используется чтобы можно было делать цепочки вызовов в том, нативном языке для данной либы: Foo.Bar().Boo().Baz() грубо говоря. Или foo(bar(str, opt2),opt1); При этом и одиночный вызов foo(str,opt) естественно имеет смысл.
-
Бывает что просто нужно вызвать чужую функцию, а возвращаемый результат не интересует.
Как сказал выше valexey, интересуют побочные эффекты (т.е. типа это процедура)
Это не часто встречается, но таки довольно удобно.
Даже при возвращаемом булево.
Например в 1С у структур есть метод "Свойство(<ИмяСвойства>, <Значение>): Булево"
Он позволяет проверить наличие свойства в структуре по его имени и заодно получить значение этого свойства.
Так вот при использовании этого метода частенько булев результат не нужен.
Пример
МояСтруктура = Новый Структура("Поле1, Поле2");
МояСтруктура.Поле1 = 10;
...
// получаем значения
// таких строк может быть много
// и в нашем алгоритме, к примеру
// Значение должно остаться равным "Неопределено"
// если такого свойства нет
Значение1 = Неопределено;
МояСтруктура.Свойство("Поле1", Значение1);
Значение2 = Неопределено;
МояСтруктура.Свойство("Поле2", Значение2);
-
Для начала надо бы выяснить, для чего это сделано. Есть идеи?
Попробую угадать, что Вирт хотел заставить проверять возвращаемую функцией ошибку - в отсутствие исключений вполне оправданное желание.
Хотя фиг знает. Я у него в коде не видел, чтоб он особо парился протаскиванем ошибок. Может из чисто эстетических соображений - если функция что-то возвращает, значит это кому-нибудь нужно (в обязательном порядке).
-
Замечу, что в Модуле-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 видно что это не просто так процедура вызывается, а она еще может и вернуть что-то полезное. Соответственно можно прикинуть пути модификации программы.
Но у меня то вопрос не о том как это выпилить или модифицировать в языке, у меня сугубо прикладной вопрос - как мне культурней работать с такими функциями? Например при написании биндингов. Как это дело в Обероне оформлять?
-
Если для импорта чужеродных функций, то действительно неважно зачем это было сделано Виртом.
Как насчет SYSTEM.EVAL() ?
-
Также можно считать, что биндинги относятся к расширизмами (а как иначе они включены в язык?), и для них действуют несколько иные правила
-
Также можно считать, что биндинги относятся к расширизмами (а как иначе они включены в язык?), и для них действуют несколько иные правила
Ненене, я не спрашиваю как именно мне писать биндинг. Я спрашиваю как мне такую забинженную функцию оформить для конечного пользоателя-программиста, который в своих модулях конечно же никакого SYSTEM использовать не будет, а будет использовать мой готовый биндинг.
Как это культурней и удобней сделать? Развалить на две функции? BooProc, BooFunc?
-
Понял. Наверно единого приемлемого решения здесь нет, в каких-то случаях - две функции, в каких-то - внешняя переменная (все равно с параллельностью Оберон не дружит), в каких-то - таки обязательное возвращаемое значение.
-
Понял. Наверно единого приемлемого решения здесь нет, в каких-то случаях - две функции, в каких-то - внешняя переменная (все равно с параллельностью Оберон не дружит), в каких-то - таки обязательное возвращаемое значение.
Ну, с параллельностью мы его еще подружим :-)
Спасибо.
-
Foo(): void
?
-
An EVAL statement has the form:
...а вот если бы были шаблоны, то можно было бы написать:
PROCEDURE EVAL<T>(x: T);
END EVAL;
-
An EVAL statement has the form:
...а вот если бы были шаблоны, то можно было бы написать:
PROCEDURE EVAL<T>(x: T);
END EVAL;
Да, дженериков не достаточно :-)