LINUX.ORG.RU

Не понимаю, что такое замыкание (closure)

 ,


5

6

Если почитать SICP, то замыкания - это такое свойство функции, что, например, «мы говорим, что операция объединения данных обладает замыканием в том случае, если результаты объединения этой операции могут объединяться этой же операцией». Поэтому я думал, что суть примера с языком описания изображений в том, что это круто, когда наши процедуры обладают этим свойством - из несложных операций с изображениями мы можем получать сложные, потому что операция над изображением - это изображение.

Но если прочитать вики, то «Замыкание (англ. closure) в программировании — функция, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции и не в качестве её параметров (а в окружающем коде).» Ну и что? Получается просто, что процедура использует глобальные переменные, ничего примечательного тут вроде и нет.

Так что такое замыкание? Помогите разобраться.

Ответ на: комментарий от quasimoto

И, да, ты опять намешал библиотечный код и пользовательский. Ты можешь привести только _библиотечный_ код, который _полностью_ решает задачу?

anonymous
()
Ответ на: комментарий от anonymous

Да вот же

Да вот же:

http://www.cplusplus.com/reference/algorithm

Типа этого кода не существует, потому что

class InputIterator

class OutputIterator

и т.п. Так что без юзерского кода итератор не выберется, инстанцирования не произойдёт и компилятор ничего делать не будет. Но тоже автоматически же всё, why bother?

Ну и аналог твоего решения выше привел, да.

А покажи как ты запускаешь его в терминале и немного выхлопа от разбора /etc/passwd (или что у тебя там)?

Ты можешь привести только _библиотечный_ код, который _полностью_ решает задачу?

От {-# до import Control.Monad — флаги и импорты. От synA до synM включительно — это самое (unlessM можно не считать — можно либо обойтись без него, либо вынести в утилитарный модуль для монад, если такой в проекте уже есть). Дальше идёт более конкретный код для двух задач — BinaryListFile -> HT и /etc/passwd -> HT, причём написан он с небольшим decoupling — fromBinaryList делает BinaryListFile -> ? в любой callback, а synToHT — ? -> HT из чего-угодно с помощью synM. Потом написана конкретная структура для User и выбрана конкретная таблица MyHT с ними, далее написана финальная synBinaryUsersToHT : BynaryListFile -> HT, опять общая (но с расчётом на User) fromPasswd : /etc/passwd -> ? и финальная synPasswdToHT : /etc/passwd -> HT. То есть обе финальных функции a -> b получают как композиции a -> ? и ? -> b где ? -> b (b == HT у нас) это один приёмник выраженный через synM, а a -> ? (a == BinaryListFile или /etc/passwd) это генератор — по одному на каждую из двух задач. Потом тест финальных функций в main.

Теперь возьми код на CL — пакеты и импорты там не показаны, это самое — synchronize, та же структура user и (глобальная там) таблица. Потом /etc/passwd -> ? и сразу /etc/passwd -> HT через synchronize. Можно сделать как у меня — добавить ? -> HT через synchronize и потом уже «композицией» получить /etc/passwd -> HT. Либо у меня сделать как там, но ? -> HT реюзается ещё в примере binary, поэтому я показал как показал.

quasimoto ★★★★
()
Последнее исправление: quasimoto (всего исправлений: 2)
Ответ на: комментарий от drBatty

это связь функции с переменной из другого контекста.

Похоже на upvar из Tcl

Xenius ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.