Возможно ли сделать функцию переключения в схеме? - PullRequest
1 голос
/ 11 ноября 2010

В ruby ​​вы можете создать простую функцию переключения следующим образом:

@switch = false

def toggle
  @switch = !@switch
end

toggle # => true
toggle # => false
toggle # => true

Мне интересно, возможно ли это сделать в схеме.Самое близкое, что я могу получить:

(define a #f)
(define (toggle a)
    (cond ((eq? a #t) #f)
      (else #t)))

(define a (toggle a))
a # => #t
(define a (toggle a))
a # => #f
(define a (toggle a))
a # => #t

Спасибо.

Ответы [ 2 ]

3 голосов
/ 11 ноября 2010

Вы можете сделать это так же, если хотите:

(define switch #f)
(define (toggle)
    (set! switch (not switch))
    switch)

Это домашнее задание?

0 голосов
/ 12 ноября 2010

Я бы написал что-то вроде этого:

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

Надеюсь, это поможет.

...