自从我上次在球拍中编程以来已经有一段时间了。
现在我想在球拍中制作一个循环列表,如下所示:
(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)