返回列表列表

时间:2017-11-19 04:42:59

标签: scheme racket

我很难弄清楚为什么我的函数buildList-aux没有返回列表Z的正确内容。

当我运行调试模式并暂停上面的if语句返回Z时,我可以看到racket中的值是正确的并且正如预期的那样,但返回并打印的实际内容有某种错误(溢出?或其他东西)并打印(shared ((-1- (list 'abc))) (list -1- -1-))

我正在运行DrRacket 6.11,高级学生语言。

(define buildList-aux
  (lambda (E Z count)
    (if (<= count 0)
        Z
        (if (not (list? E))
            (buildList-aux E (append (list E) Z) (- count 1))
            (buildList-aux E (cons E Z) (- count 1))))))

(define buildList
  (lambda (N E)
    (buildList-aux E '() N)))

(buildList 5 '())
(buildList 3 'A)
(buildList 2 '(abc))
(buildList 3 '(A))

预期产出:

(list '() '() '() '() '())
(list 'A 'A 'A)
(list (list 'abc) (list 'abc))
(list (list 'A) (list 'A) (list 'A))

实际输出:

(list '() '() '() '() '())
(list 'A 'A 'A)
(shared ((-1- (list 'abc))) (list -1- -1-))
(shared ((-1- (list 'A))) (list -1- -1- -1-))

1 个答案:

答案 0 :(得分:2)

您的代码是正确的,它只是列表在“高级学生”中显示的方式。要查看正确的输出,请按@JohnClements建议并转到“语言详细信息”,并取消选中“在值中显示共享”框。或者,切换到“从源检测语言”并在文件顶部指定#lang racket。无论哪种方式,输出都将按预期进行:

'(() () () () ())
'(A A A)
'((abc) (abc))
'((A) (A) (A))

但是让我们来看看那个奇怪的输出:

(shared ((-1- (list 'abc))) (list -1- -1-))

以上说明结果是:

(list -1- -1-)

-1-视为代表共享数据的“变量”,其值为(list 'abc)。如果我们用它的值替换“变量”,我们会更熟悉:

(list (list 'abc) (list 'abc))