Обновлять
Я разрабатываю экспериментальный язык программирования, и вопрос в том, включать ли замыкания или просто использовать функции первого класса. Чтобы решить это, мне нужны реалистичные варианты использования / примеры, которые показывают преимущество замыканий над первоклассными функциями. Я знаю, что вы можете достичь всего, чего можете достичь с помощью одного из двух без них, но есть несколько вариантов использования, например, первоклассные функции, код которых легче читать (например, короче или не разбит на несколько классов). Например:
Рубин:
[1,5,7].map{|x| x*x }
[1,'test',3].select{|x| x.kind_of? Integer}.map{|x| x.to_s }
big_array.each{ |item| puts item }
Без функций первого класса эти примеры были бы намного более подробными, поскольку вам пришлось бы использовать циклы for или подобные вещи.
Итак, какие варианты использования показывают полезность замыканий? Несмотря на то, что я часто использую первоклассные функции, я действительно не мог придумать хороших вариантов использования для замыканий. Есть ли у вас хорошие варианты использования закрытий?
Исходный пост
Я не понимаю, почему замыкания привязаны к переменным, а не только к значениям, например:
Рубин:
x = 5
l = lambda { x }
l.call #=> 5
x = 100
l.call #=> 100
Какая польза от ссылки на переменные вместо простой ссылки на значения, хранящиеся в переменных в точке определения закрытия? Как в этом примере:
Рубин:
x = 5
l = lambda { x }
l.call #=> 5
x = 100
l.call #=> 5, not 100
Есть ли хорошие варианты использования, когда необходимо ссылаться на переменные, а не только на значения этих переменных в точке определения закрытия?