Я хотел бы написать что-то вроде этого:
(define switch
((lambda (state)
(lambda()
(begin
(set! state (not state))
state)))
#f))
который может быть вызван следующим образом:
> (switch)
#t
> (switch)
#f
> (switch)
#t
Небольшое пояснение: внешний лямбда-функция, которая принимает начальное состояние и возвращает другое функция, которая переворачивает это состояние вперед и назад при каждом вызове. Обратите внимание, что внешняя функция вызывается немедленно с #f
на последней строке; тогда переключатель определяется как результат этого вызова, внутренняя функция захватывает state
в закрытии.
Вы также могли бы написать что-то вроде этого:
(define make-switch
(lambda()
((lambda (state)
(lambda()
(begin
(set! state (not state))
state)))
#f)))
make-switch
берет то, что было раньше, и заворачивает его в другом функции. Теперь у нас есть фабрика для создания коммутаторов, каждая из которых имеет собственное внутреннее состояние. Таким образом, мы можем написать что-то вроде этого:
(define switch-a (make-switch))
(define switch-b (make-switch))
И видим, что каждый коммутатор не зависит от другого:
> (switch-a)
#t
> (switch-b)
#t
> (switch-b)
#f
> (switch-a)
#f
Аналогично можно параметризировать make-switch
установить начальное состояние переключателя, и на и на.
Надеюсь, это поможет.
Идея «no-mutations» заключается в том, что функции никогда не должны изменять что-либо вне себя. Таким образом, вы можете запускать функции, не беспокоясь о том, будут ли они иметь странные эффекты для остальной части программы. – erjiang
Я понимаю функциональную парадигму (хотя я не уверен, что готов подписаться на нее еще). «Никогда» не настолько строг. Иногда, вы не тайно думаете: «Ох, если вспомнить о событии, было бы так приятно». Любое интерактивное программное обеспечение должно отслеживать взаимодействия - должно сохранять воспоминания о некоторых событиях/настройках. – Tim