It has been a while since i last programmed in Racket. Now i wanted to make a circular list in Racket as follows :
(define x (list 1 2))
(set-mcdr! (cdr x) x)
But this gives rises to the error :
set-mcdr!: contract violation
expected: mpair?
given: '(2)
argument position: 1st
other arguments...:
'(1 2)
I'm surprised because (cddr x)
is '()
so I don't understand why he tells me "expected: mpair?" as '(2)
is a pair (with cdr
the empty list).
Thanks for your help!
The list must be mutable if you want set-mcdr!
to work, and all procedures used must also operate on mutable pairs; please check the documentation and notice that all the procedures contain an m
as part of their name. For example, try this:
(require racket/mpair)
(define x (mlist 1 2))
(set-mcdr! (mcdr x) x)