我很难弄清楚为什么我的函数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-))
答案 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))