DrRacket计划合同违规

时间:2016-01-10 23:27:23

标签: scheme racket

我不知道为什么我在DrRacket中收到合同违规行为。

(define (range rlist)
(display 'ran)
(let ([start (car  rlist)]
    [step  (cdr  rlist)]
    [end   (cddr rlist)])
(cond [(< start end)
      (set (car rlist) (+ (car rlist) (cdr rlist)))
      (cons start (range rlist))
      ]
     )
))

我得到了

<: contract violation
  expected: real?
  given: '(7)
  argument position: 2nd
  other arguments.:

1 个答案:

答案 0 :(得分:1)

我假设rlist应该是一个数字列表。

但是,在let绑定中,您将stepend绑定到列表而不是列表中的数字。

您无法比较我假设为start的数字与end的数字绑定值'(7)

你仍然缺少一个其他情况,如果开始不低于结束怎么办?

另外(set (car rlist) ...) isn't going to work it just isn't. You can only设置!`变量,而不是值。只需传递递归调用中的更改即可。如果您不希望在每次递归上构建列表的开销,则定义一个内部产品(定义或让循环),它接受三个参数。

(define (range rlist)
  (display 'ran)
  (let ([start (car  rlist)]
        [step  (cadr  rlist)]
        [end   (caddr rlist)])
     (cond [(< start end)
            (cons start 
                  (range (list (+ start step)
                               step
                               stop)))]
            [else '()])))

可能更接近你想要的东西