Racket 中的循环列表
Circular lists in Racket
自从我上次在 Racket 中编程以来已经有一段时间了。
现在我想在球拍中制作一个循环列表如下:
(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)
是 '()
所以我不明白他为什么告诉我 "expected: mpair?" 因为 '(2)
是一对(与 cdr
空列表)。
感谢您的帮助!
如果你想让set-mcdr!
工作,列表必须是可变的,并且所有使用的过程也必须对可变对进行操作;请检查 documentation 并注意所有过程都包含 m
作为其名称的一部分。例如,试试这个:
(require racket/mpair)
(define x (mlist 1 2))
(set-mcdr! (mcdr x) x)
自从您使用 Racket 以来,他们引入了不可变对作为标准。这意味着您不能设置 car
或 cdr
除非它由 mcons
.
构成
但是,在 SRFI-1 中有一个构造函数可以生成循环列表并使列表与 #!racket 中所有需要不可变列表的过程兼容:
#!racket
(require srfi/1)
(circular-list 1 2 3) ; ==> #0=(1 2 3 . #0#)
;; alternatively you can make a list circular
(apply circular-list '(1 2 3)) ; ==> #0=(1 2 3 . #0#)
(map cons '(1 2 3 4 5 6) (circular-list #t))
; ==> ((1 . #t) (2 . #t) (3 . #t) (4 . #t) (5 . #t) (6 . #t))
其他答案当然是完全正确的。不过,我想补充一点,可能有一种不同的数据结构可以更好地满足您的需求!我会看看 in-cycle
:
#lang racket
(define cyclic-sequence
(in-cycle (list 3 4 5)))
(for/list ([elt cyclic-sequence]
[i (in-range 13)])
elt)
自从我上次在 Racket 中编程以来已经有一段时间了。 现在我想在球拍中制作一个循环列表如下:
(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)
是 '()
所以我不明白他为什么告诉我 "expected: mpair?" 因为 '(2)
是一对(与 cdr
空列表)。
感谢您的帮助!
如果你想让set-mcdr!
工作,列表必须是可变的,并且所有使用的过程也必须对可变对进行操作;请检查 documentation 并注意所有过程都包含 m
作为其名称的一部分。例如,试试这个:
(require racket/mpair)
(define x (mlist 1 2))
(set-mcdr! (mcdr x) x)
自从您使用 Racket 以来,他们引入了不可变对作为标准。这意味着您不能设置 car
或 cdr
除非它由 mcons
.
但是,在 SRFI-1 中有一个构造函数可以生成循环列表并使列表与 #!racket 中所有需要不可变列表的过程兼容:
#!racket
(require srfi/1)
(circular-list 1 2 3) ; ==> #0=(1 2 3 . #0#)
;; alternatively you can make a list circular
(apply circular-list '(1 2 3)) ; ==> #0=(1 2 3 . #0#)
(map cons '(1 2 3 4 5 6) (circular-list #t))
; ==> ((1 . #t) (2 . #t) (3 . #t) (4 . #t) (5 . #t) (6 . #t))
其他答案当然是完全正确的。不过,我想补充一点,可能有一种不同的数据结构可以更好地满足您的需求!我会看看 in-cycle
:
#lang racket
(define cyclic-sequence
(in-cycle (list 3 4 5)))
(for/list ([elt cyclic-sequence]
[i (in-range 13)])
elt)