如何摆脱计划中的额外列表级别?

时间:2017-04-10 19:26:21

标签: recursion scheme

我的下面的函数必须接受如下输入:

(getlist '(a b '(a b) 1 2 '() '(1 2)) )

然后,该函数必须输出原始列表中所有列表的列表。所以输出应该像

"((a b)()(1 2))" 

但我得到了这个:

"((quote (a b)) (quote ()) (quote (1 2)))"

我得到了正确的值,但它们都包含在附加引号的额外列表中。我该如何解决这个问题?

谢谢

;function to return all lists in a list
(define (getlist lst)
    ;if list is empty 
    (if (null? lst)
        ;true
        '()
        ;false
        (if (list? (car lst))
            ;true
            (cons (car lst) (getlist (cdr lst)))
            ;false
            (getlist (cdr lst)))))

1 个答案:

答案 0 :(得分:2)

这是因为输入列表确实包含列表(quote (a b))(quote ())(quote (1 2))
永远不会评估符号quote

'不是“列表构建”运算符 它是quote特殊形式的简写,导致其参数不被评估。

由于引用了整个列表,因此您未评估'(a b) - 即(quote (a b)) - 结果是列表(quote (a b))

修复是删除除最外面的引号之外的所有引号:

> (getlist '(a b (a b) 1 2 () (1 2)))
'((a b) () (1 2))