Scheme在一个条件下执行多个作业的方案

时间:2013-05-12 09:22:18

标签: scheme racket

我试图在一个条件下执行多个任务,这是我的代码:

(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个工作?

提前致谢。

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