1

特定のアリティの関数を返す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) によって返されるさまざまな整数アリティの関数のセットが必要です。スキーム/ラケットで定義することは可能ですか?

4

2 に答える 2