Оберон-клуб «ВЄДАsoft»

Твердыня модульных языков
Текущее время: 28 мар 2024, 11:40

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




Начать новую тему Ответить на тему  [ Сообщений: 34 ]  На страницу Пред.  1, 2, 3, 4  След.
Автор Сообщение
СообщениеДобавлено: 30 мар 2018, 11:33 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Процитируем для geniepro, чтобы разобрался, а то у него, видимо, нет опыта работы на Паскаль-подобных языках.

Цитата:
Вложенная функция — это функция, определенная внутри другой функции. Имя вложенной функции является локальным в блоке, где она определена. Например, здесь мы определяем вложенную функцию с именем square и вызываем ее дважды:
Код: "C"
foo (double a, double b) {
double square (double z) { return z * z; }
return square (a) + square (b);
}
Вложенная функция имеет доступ ко всем переменным объемлющей функции, которые видны в точке её определения. Это называется "лексическая область действия".

Тут область действия функции сужена предельно.

Лямбда же — несколько другое понятие: функция, которая передаётся на исполнение куда-то [параметром вовнутрь другой, внешней по отношению к ней функции].


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 30 мар 2018, 12:39 
Не в сети

Сообщения: 203
Zorko писал(а):
Лямбда же — несколько другое понятие: функция, которая передаётся на исполнение куда-то [параметром вовнутрь другой, внешней по отношению к ней функции].
У тебя какие-то странные представления о лямбдах, видимо, нет опыта работы с лямбда-исчислением.
Вот обычная лямбда на C# -- чем она отличается по своей сути от вложенной функции? Ну, немного другой синтаксис описания, но суть-то та же.
Код: "C"
double foo(double a, double b) {
Func<double, double> square = (double z) => { return z * z; };
return square(a) + square(b);
}

Оказывается, в C# завезли кучу нового, в том числе локальные (вложенные) функции:
https://docs.microsoft.com/en-us/dotnet ... -functions
Так что этот пример может выглядеть так:
Код: "C"
static double foo(double a, double b) {
double square(double z) { return z * z; }
return square(a) + square(b);
}


Последний раз редактировалось geniepro 04 дек 2018, 13:44, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 30 мар 2018, 13:33 
Не в сети

Сообщения: 203
Для сравнения могу привести пример на хаскелле реализации функции Фибоначчи через вложенную функцию и через лямбды -- разница лишь чисто синтаксическая:
Код: "HASKELL"
fib m = let f a b n = if n == 0 then a else f b (a+b) (n-1)
in f 0 1 m
 
fib = λm -> let f = λa -> λb -> λn -> if n == 0 then a else f b (a+b) (n-1)
in f 0 1 m
В первом варианте, по сути, просто используется синтаксический сахар для второго варианта.


Последний раз редактировалось geniepro 30 мар 2018, 17:31, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 30 мар 2018, 15:36 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Нас тут в группе по Оберону функциональщики прессовали, что вы-де не понимаете лямбд, на Обероне они вообще невозможны, лишь их какая-то невнятная эмуляция. А щас хаскелист тыкает меня носом, что лямбды это, оказывается, обычные функции. Блять, как же все любят поумничать.


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 30 мар 2018, 16:05 
Не в сети

Сообщения: 146
Возможно, произошла путаница безымянных функций и замыканий?


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 30 мар 2018, 17:19 
Не в сети

Сообщения: 203
Zorko писал(а):
Нас тут в группе по Оберону функциональщики прессовали, что вы-де не понимаете лямбд, на Обероне они вообще невозможны, лишь их какая-то невнятная эмуляция. А щас хаскелист тыкает меня носом, что лямбды это, оказывается, обычные функции. Блять, как же все любят поумничать.

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

Короче, функции -- это лямбды, которым дали имена.

функция = лямбда + имя
лямбда = функция - имя


Последний раз редактировалось geniepro 30 мар 2018, 17:49, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 30 мар 2018, 17:21 
Не в сети

Сообщения: 203
Comdiv писал(а):
Возможно, произошла путаница безымянных функций и замыканий?

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


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 30 мар 2018, 19:21 
Не в сети

Сообщения: 146
Я об этом же.


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 30 мар 2018, 19:29 
Не в сети

Сообщения: 203
Comdiv писал(а):
Я об этом же.

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


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 30 мар 2018, 19:57 
Не в сети

Сообщения: 11
geniepro писал(а):
в обероне вообще нет вложенных процедур
Since procedures may be declared as local objects too, procedure declarations may be nested.
Код: "OBERON"
  1. ProcedureDeclaration = ProcedureHeading ";" ProcedureBody ident.
  2. ProcedureHeading = PROCEDURE identdef [FormalParameters].
  3. ProcedureBody = DeclarationSequence [BEGIN StatementSequence]
  4. [RETURN expression] END.
  5. DeclarationSequence = [CONST {ConstDeclaration ";"}]
  6. [TYPE {TypeDeclaration ";"}] [VAR {VariableDeclaration ";"}]
  7. {ProcedureDeclaration ";"}.


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

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


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

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


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

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
© VEDAsoft Oberon Club