clojure – Lisp系言語への自動カレー化を実装することは可能ですか?

つまり、引数が1つだけの> 1アリティを持つ関数を呼び出すときは、エラーを表示する代わりに、その引数をカリー化し、結果の関数のアリティを減らして返す必要があります。 Lispのマクロを使ってこれを行うことは可能ですか?
ベストアンサー
Schemeでは、カレー手続きを使って関数をカレーすることができます。

(define (add x y)
  (+ x y))

(add 1 2)           ; non-curried procedure call
(curry add)         ; curried procedure, expects two arguments
((curry add) 1)     ; curried procedure, expects one argument
(((curry add) 1) 2) ; curried procedure call

ラケットのdocumentationから:

[curry] returns a procedure that is a curried version of proc. When the resulting procedure is first applied, unless it is given the maximum number of arguments that it can accept, the result is a procedure to accept additional arguments.

次のように、新しい手続きを定義するときに自動的にカレーを使用するマクロを簡単に実装できます。

(define-syntax define-curried
    (syntax-rules ()
      ((_ (f . a) body ...)
       (define f (curry (lambda a (begin body ...)))))))

次のaddの定義はカレー化されます。

(define-curried (add a b)
  (+ a b))

add
> #<procedure:curried>

(add 1)
> #<procedure:curried>

((add 1) 2)
> 3

(add 1 2)
> 3

転載記事の出典を記入してください: clojure – Lisp系言語への自動カレー化を実装することは可能ですか? - コードログ