Я бы написал что-то вроде этого:
(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
для установки начального состояния коммутатора, а также включения и выключения.
Надеюсь, это поможет.