Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 是否可以在scheme中设置切换功能?_Ruby_Scheme_Toggle - Fatal编程技术网

Ruby 是否可以在scheme中设置切换功能?

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)))

在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

谢谢。

如果您愿意,也可以用同样的方法:

(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
。)