[英]Flip function in Scheme
有谁知道我该如何在Scheme中创建一个不带任何参数的函数,每次调用该函数都返回0或1,具体取决于调用了多少次? 例如,第一次返回1,第二次返回0,第三次返回1。
我想我必须在函数内部使用局部变量,但是我不知道具体如何,因此每次调用它时它都会改变值。
您没有说如何调用函数。 您是否将一些命名函数定义为随make-flip
函数返回的lambda? 我想这是“制作封包101”,但这是我第一次回忆。 无论如何,我尝试过这种方式,它似乎有效:
(define (make-flipper)
(let ((flip 0))
(lambda ()
(set! flip (if (= flip 0) 1 0))
flip)))
(define doit (make-flipper))
(doit)
(doit)
(doit)
-结果为1,然后为0,然后为1。我想如果希望它以0开头,则可以更改let的值。
您的代码无效,因为您过度使用了括号,这使您的代码尝试调用不是过程的“过程”。
您的代码,
(define (make-flip)
(let ((x 1))
(lambda ()
((set! x (- 1 x))
(if (= x 0) (1) (0))))))
尝试过程调用(0)
和(1)
,并且还尝试“调用”序列的结果
(set! x (- 1 x))
(if (= x 0) (1) (0)))
(方案永远不会像其他语言一样忽略任何括号。)
如果修复这些,
(define (make-flip)
(let ((x 1))
(lambda ()
(set! x (- 1 x))
(if (= x 0) 1 0))))
有用。
您也可以说条件不是必需的
(define (make-flip)
(let ((x 0))
(lambda ()
(set! x (- 1 x))
x)))
并获得相同的结果。
如果只需要一种此类过程,则还可以执行以下操作:
(define flip
(let ((x 1))
(lambda ()
(begin0
x
(set! x (- 1 x))))))
测试:
> (flip)
1
> (flip)
0
> (flip)
1
> (flip)
0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.