如何处理任意数量的引用参数?

问题描述 投票:0回答:1

我想要一个处理任意数量的带引号的符号的函数。

(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)

显然我误解了引号、符号、数据等的工作原理。你会如何编写一个函数来执行此操作?

racket
1个回答
0
投票

当您在

f
子句中递归调用
match
时,您将传递一个列表作为其唯一参数。因为该函数是使用点休息 lambda 列表定义的,所以
args
是一个包含一个元素的列表,该元素本身就是一个列表(例如
arg
'((two three))
),无法满足所有
match
条件。

一个修复方法是在递归时使用

(apply f (rest args))
。或者,您可以有一个辅助函数,它采用顶层
f
调用的单个列表参数,在递归时调用自身,而不是
f
。那么你就不需要
apply

© www.soinside.com 2019 - 2024. All rights reserved.