Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 球拍中的循环列表_List_Racket - Fatal编程技术网

List 球拍中的循环列表

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

我已经有一段时间没有在球拍上编程了。 现在我想在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)
”()
,所以我不明白为什么他告诉我“预期: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个可变列表函数下。