Будучи относительно новым для функционального программирования, я трачу много энергии на размышления: "Это функциональный способ сделать что-то?" Очевидно, что рекурсия против итерации довольно проста, и очевидно, что рекурсия - это функциональный способ делать вещи. Но, например, возьмите закрытие. Я узнал о закрытии с помощью Lisp, и я понимаю, что замыкания - это комбинация функции и среды (звучит так же, как состояние и поведение). Например:
(let ((x 1))
(defun doubleX()
(setf x (* x 2))))
Здесь мы имеем функцию doubleX, которая была определена в среде переменной x. Мы могли бы передать эту функцию другим функциям, а затем вызвать ее, и она все равно сможет ссылаться на переменную x. Функция может продолжать ссылаться на эту переменную, даже если она вызывается вне среды, где определена переменная. Многие из примеров, которые я видел при закрытии, выглядят так. Если setf используется для изменения значения лексической переменной. Это меня смущает, потому что:
1.) Я думал, что setf был злым. В основном потому, что он вызывает побочные эффекты и, по-видимому, они также злы.
2.) Действительно ли это "функционально"? Похоже, это просто способ сохранить глобальное состояние, и я думал, что функциональные языки не имеют гражданства.
Возможно, я просто не понимаю закрытия. Может кто-нибудь помочь мне?