如何在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