我的下面的函数必须接受如下输入:
(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)))))
答案 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))