-1

我试图在一个 if 条件下完成一项以上的任务,这是我的代码:

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

提前致谢。

4

2 回答 2

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
于 2013-05-12T10:20:22.830 回答
1

的语法cond是:

(cond (<predicate> <body> ...)
      ...)

where<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))))
于 2013-05-12T14:33:00.173 回答