我试图在一个条件下执行多个任务,这是我的代码:
(define (dont-tolerate-fools hist0 hist1 hist2 count)
(cond ((> 10 count) 'c)
((< 10 count) (soft-tit-for-tat hist0 hist1 hist2))
((> 10 count) (dont-tolerate-fools hist0 hist1 hist2 (+ 1 count)))))
它不起作用,因为我看到其中一个条件是真的它返回并打破。我试图让它在前10次返回'c后,它应该根据别的东西行事。
可能有不同的方法可以做到这一点,但我很有兴趣如何通过仅检查一个if条件来完成2个工作?
提前致谢。
答案 0 :(得分:2)
如果你想要在前10次做某事,那么之后的其他事情,最简单的方法是使用某种“本地”变量来计算你被调用的次数,例如:
(define func
(let ((count 0))
(lambda ()
(cond
((< count 10)
(set! count (+ count 1))
'a)
(else 'b)))))
(for/list ((i (in-range 15)))
(func))
=> '(a a a a a a a a a a b b b b b)
您还可以在该示例中看到在条件之后可以有多个表单或值:
(cond
((< count 10)
(set! count (+ count 1)) ; action 1
'a) ; action 2
OTOH,如果这只是一个循环,那么你就错过了一个停止条件和一个电话:
(define (func (n 0))
(cond
((> n 15)
'stop)
((< n 10)
(display 'c)
(func (+ n 1)))
(else
(display 'x)
(func (+ n 1)))))
(func)
=> ccccccccccxxxxxx'stop
答案 1 :(得分:1)
cond
的语法是:
(cond (<predicate> <body> ...)
...)
其中<body> ...
表示任意数量的表达式。因此,您只需将代码重写为:
(define (dont-tolerate-fools hist0 hist1 hist2 count)
(cond ((> 10 count)
(dont-tolerate-fools hist0 hist1 hist2 (+ 1 count))
'c)
((< 10 count) (soft-tit-for-tat hist0 hist1 hist2))))