【发布时间】:2015-12-03 18:57:17
【问题描述】:
如何在 Scheme / Racket 中定义一个返回特定参数函数的函数?
目前我的代码中有以下内容:
(define (get-function n)
(cond
[(= n 1) (lambda (a) a)]
[(= n 2) (lambda (a b) (+ a b))]
[(= n 3) (lambda (a b c) (+ a b c))]
; and so on
))
当然,它返回的函数的数量是 n:
(procedure-arity (get-function 3)) ; returns 3
请不要介意“+”,在我的程序中它比“+”的折叠更复杂。但是,该函数的结构也可以递归定义;类似于:
(define (get-function-variadic n)
(lambda arguments
(if (empty? arguments) 0
(+ (car arguments)
(apply (get-function-variadic (sub1 n)) (cdr arguments))))))
然后它返回可变参数函数:
(procedure-arity (get-function-variadic 3)) ; returns #(struct:arity-at-least 0)
这样所有这些都像普通的 Scheme 的可变参数“+”一样工作:
((get-function-variadic 3) 1 2 3)
((get-function-variadic 3) 1 2)
((get-function-variadic 3) 1 2 3 4)
事实上,我只希望第一个返回结果,而其他人应该返回错误“参数数量错误”。此外,在程序的其他部分,我依赖于生成的函数的数量。因此,可变参数函数不适合我(即使它检查“参数”的长度)。我需要一组由(get-function n)返回的不同整数的函数。是否可以在 Scheme / Racket 中定义?
【问题讨论】:
-
这是macro的典型任务,不是函数。
-
@Renzo,我通过宏试了一下,见下文。似乎正在工作。但是,Greg 建议有一个更好的选择。
标签: lambda scheme racket variadic arity