自从我上次在球拍中编程以来已经有一段时间了。
现在我想在球拍中制作一个循环列表,如下所示:

(define x (list 1 2))
(set-mcdr! (cdr x) x)


但这引起了错误:

set-mcdr!: contract violation
expected: mpair?
given: '(2)
argument position: 1st
other arguments...:
 '(1 2)


我很惊讶,因为(cddr x)'(),所以我不明白他为什么对我说“期望:双胞胎”?因为'(2)是一对(cdr为空列表)。

谢谢你的帮助!

最佳答案

如果要set-mcdr!工作,该列表必须是可变的,并且使用的所有过程也必须在可变对上运行;请检查documentation,并注意所有过程的名称中都包含m。例如,尝试以下操作:

(require racket/mpair)

(define x (mlist 1 2))
(set-mcdr! (mcdr x) x)

10-04 11:34