Ruby 是否可以在scheme中设置切换功能?
在ruby中,您可以创建一个简单的切换函数,如下所示:Ruby 是否可以在scheme中设置切换功能?,ruby,scheme,toggle,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)))
@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
谢谢。如果您愿意,也可以用同样的方法:
(define switch #f)
(define (toggle)
(set! switch (not switch))
switch)
这是家庭作业吗?我会这样写:
(define switch
((lambda (state)
(lambda ()
(begin
(set! state (not state))
state)))
#f))
> (switch)
#t
> (switch)
#f
> (switch)
#t
(define make-switch
(lambda ()
((lambda (state)
(lambda ()
(begin
(set! state (not state))
state)))
#f)))
(define switch-a (make-switch))
(define switch-b (make-switch))
可以这样调用:
(define switch
((lambda (state)
(lambda ()
(begin
(set! state (not state))
state)))
#f))
> (switch)
#t
> (switch)
#f
> (switch)
#t
(define make-switch
(lambda ()
((lambda (state)
(lambda ()
(begin
(set! state (not state))
state)))
#f)))
(define switch-a (make-switch))
(define switch-b (make-switch))
一点说明:外部lambda是一个函数,它接受初始状态并返回另一个函数,该函数在每次调用时来回翻转该状态。注意,在最后一行的#f
中,外部函数立即被调用;然后,开关被定义为该调用的结果,内部函数在闭包中捕获状态
你也可以这样写:
(define switch
((lambda (state)
(lambda ()
(begin
(set! state (not state))
state)))
#f))
> (switch)
#t
> (switch)
#f
> (switch)
#t
(define make-switch
(lambda ()
((lambda (state)
(lambda ()
(begin
(set! state (not state))
state)))
#f)))
(define switch-a (make-switch))
(define switch-b (make-switch))
makeswitch
将我们以前拥有的功能打包到另一个函数中。现在我们有一个制造开关的工厂,每个开关都有自己的内部状态。我们可以这样写:
(define switch
((lambda (state)
(lambda ()
(begin
(set! state (not state))
state)))
#f))
> (switch)
#t
> (switch)
#f
> (switch)
#t
(define make-switch
(lambda ()
((lambda (state)
(lambda ()
(begin
(set! state (not state))
state)))
#f)))
(define switch-a (make-switch))
(define switch-b (make-switch))
并确保每个开关相互独立:
> (switch-a)
#t
> (switch-b)
#t
> (switch-b)
#f
> (switch-a)
#f
类似地,您可以参数化make switch
,以设置开关的初始状态,以及on和on
希望这有帮助。不是作业。我喜欢比较和对比各种语言,而我的砧板上的就是scheme。我没有注意到开关!功能——在《小阴谋家》中从未出现过。谢谢你的回答。我想你指的是布景!函数,但是的,有一个计划程序员的子崇拜,他们试图避免变异,这可能就是为什么它没有出现在小计划中。这个计划相当巧妙——希望你们能在你们的街区里保留一段时间。是的,你们是对的。我的意思是设置!。现在,使用scheme有点像运行间隔。这是一个令人不舒服的挑战,但我也可以告诉你,用这种新的(对我来说)功能性的方式思考问题会带来一些好处代码>已覆盖。哦,我正在阅读SS,但刚刚开始。我迫不及待地想见到赛特!“无突变”的理念是函数不应该修改自身之外的东西。通过这种方式,您可以运行函数,而不用担心它们是否会对程序的其余部分产生奇怪的影响。我理解函数范式(尽管我不确定我是否愿意订阅它)。“从不”是如此严格。有时候,你不会暗自想,“哦,有一个事件发生的记忆会很好。”任何交互软件都必须跟踪交互——必须保留一些事件/设置的记忆。我很敬畏。你是一个兰姆达吊具大师。这给了我很多思考的余地。谢谢你。@Tim和所有事情一样,只需要一点练习。继续努力,你会得到的。(为了记录在案,我发现第二次使用小阴谋家非常有用。)记住:当有疑问时,只需在它周围再包装一个
lambda
。)