List 球拍中的循环列表
我已经有一段时间没有在球拍上编程了。 现在我想在Racket中做一个循环列表,如下所示:List 球拍中的循环列表,list,racket,List,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)是”(),所以我不明白为什么他告诉我“预期:mp
(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)
是”()
,所以我不明白为什么他告诉我“预期:mpair?”因为”(2)
是一对(与cdr
是空列表)
谢谢你的帮助 如果您想要设置mcdr,列表必须是可变的代码>工作,并且使用的所有程序也必须在可变对上运行;请检查并注意,所有过程的名称中都包含一个m
。例如,尝试以下方法:
(require racket/mpair)
(define x (mlist 1 2))
(set-mcdr! (mcdr x) x)
由于您使用Racket,所以他们引入了不可变对作为标准。这意味着您不能设置
car
或cdr
,除非它由mcons
构成
但是,在SRFI-1中有一个构造函数,它生成循环列表,并使列表与#中的所有过程兼容!期望不可变列表的racket:
#!球拍
(需要srfi/1)
(循环列表1 2 3);==>#0=(1 2 3 . #0#)
;; 或者,您可以制作一个循环列表
(应用循环列表’(1 2 3));=>#0=(1 2 3 . #0#)
(地图cons’(123456)(循环列表)
; ==> ((1.#t)(2.#t)(3.#t)(4.#t)(5.#t)(6.#t))
其他答案当然完全正确。不过,我想补充一点,可能会有一种不同的数据结构更好地满足您的需求!我想看一下循环中的:
#lang racket
(define cyclic-sequence
(in-cycle (list 3 4 5)))
(for/list ([elt cyclic-sequence]
[i (in-range 13)])
elt)
的完整文档。它隐藏在tracket文档索引中的遗留语言和库->兼容性:来自Racket亲属的特性->3个可变列表函数下。