我不知道为什么我在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.:
答案 0 :(得分:1)
我假设rlist应该是一个数字列表。
但是,在let
绑定中,您将step
和end
绑定到列表而不是列表中的数字。
您无法比较我假设为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 '()])))
可能更接近你想要的东西