是否可以在方案中进行切换功能?

时间:2010-11-11 04:59:54

标签: ruby scheme toggle

在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 个答案:

答案 0 :(得分:3)

如果您愿意,可以采用相同的方式:

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

这是家庭作业吗?

答案 1 :(得分:0)

我会写这样的东西:

(define switch
  ((lambda (state)
     (lambda ()
       (begin
         (set! state (not state))
         state)))
   #f))

可以这样调用:

> (switch)
#t
> (switch)
#f
> (switch)
#t

一个小解释:外部lambda是一个函数,它接受一个初始状态并返回另一个在每次调用时来回翻转该状态的函数。请注意,在最后一行使用#f立即调用外部函数;然后将switch定义为此调用的结果,内部函数在闭包中捕获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来设置开关的初始状态,以及开启和开启。

希望这有帮助。