我想要一个处理任意数量的带引号的符号的函数。
(define (f . args)
(if (empty? args)
'()
(match (first args)
['one (cons 1 (f (rest args)))]
['two (cons 2 (f (rest args)))]
['three (cons 3 (f (rest args)))])))
但是运行这个
(f 'one 'two 'three)
出现错误
match: no matching clause for '(two three)
显然我误解了引号、符号、数据等的工作原理。你会如何编写一个函数来执行此操作?
当您在
f
子句中递归调用 match
时,您将传递一个列表作为其唯一参数。因为该函数是使用点休息 lambda 列表定义的,所以 args
是一个包含一个元素的列表,该元素本身就是一个列表(例如 arg
是 '((two three))
),无法满足所有 match
条件。
一个修复方法是在递归时使用
(apply f (rest args))
。或者,您可以有一个辅助函数,它采用顶层 f
调用的单个列表参数,在递归时调用自身,而不是 f
。那么你就不需要 apply
。