我写了一个非常简单的函数给我一个两个边界之间所有整数的列表。
但是,它不是输出一个列表,而是给我一个由嵌套的mcons单元格构成的数据结构。
我究竟做错了什么?
#lang racket
(require rnrs/base-6)
(define (enumerate low high)
(if (> low high)
'()
(cons low
(enumerate (+ low 1) high))))
(enumerate 1 10)
;(mcons 1 (mcons 2 (mcons 3 (mcons 4 (mcons 5 (mcons 6 (mcons 7 (mcons 8 (mcons 9 (mcons 10))))))))))
答案 0 :(得分:5)
#!r6rs
和#!racket
(#lang racket
的缩写)是不同的语言。 Racket允许你混合它们,但R6RS中的对是基于可变对,而#!racket使用不可变对。在#!中,mcons
的默认输出语法(来自R6RS库的所有程序对)都是constructor
,这样您就可以清楚地看到它们与#!球拍列表之间的区别。
我建议您不要混合语言,但如果这正是您想要的,您可以更改交互窗口在语言选项中显示结果的行为(在左下角的选择框中,选择“选择语言”,然后单击显示详细信息。在“输出语法”下,您可以选择要显示为构造函数,quasiquote,write(您所期望的)或打印的所有内容(根据所选语言进行默认打印)。
因此,如果选择不混合语言,您只需删除(require rnrs/base-6)
,因为rnrs基础库与#!racket/base
几乎具有相同的内容,并且您的程序将较大的#!racket
定义为语言。但是,如果你需要变异对,那么在#!racket中进行变换非常糟糕,那么你可以通过改变#!r6rs and
(import(rnrs)) mcons
will display in #!r6rs as
来改变为R6RS `做#!球拍。
答案 1 :(得分:2)
因为cons
中定义的rnrs/base-6
等同于球拍的mcons
并创建了该类型的值(因为Scheme列表是可变的,而Racket列表不是)。
答案 2 :(得分:2)
你在这里混合使用Racket和Scheme;如果你省略require
表格,那么它将是纯粹的球拍并返回
'(1 2 3 4 5 6 7 8 9 10)