我为什么要在我的缺点列表中获取mcons细胞?

时间:2014-05-01 16:24:16

标签: scheme racket

我写了一个非常简单的函数给我一个两个边界之间所有整数的列表。

但是,它不是输出一个列表,而是给我一个由嵌套的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))))))))))

3 个答案:

答案 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)