如何在Scheme /球拍中定义返回特定区域功能的功能?功能在特定区域的方案/球拍返回功能
目前,我有我的代码如下:
(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)
,使所有这些工作只是作为正常计划的可变参数 “+” 的:
((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中定义?
这是[宏](http://docs.racket-lang.org/guide/macros.html)的典型任务,而不是函数。 – Renzo
@Renzo,我试了一下宏,请看下面。似乎工作。但是,Greg建议有更好的选择。 – formalizm