Let's try this again...
The last one worked (by coincidence) for simple cases. But then I noticed:
> ((((((curry list a c e b d) 1) 2) 3) 4) 5)
(1 4 2 5 3)
The parameters descending down the lambda chain should be ordered, but
not the final parameter list sent to the procedure. So... here's a
version which works on the above test. I.e. the above should result in:
(lambda (a)
(lambda (b)
(lambda (c)
(lambda (d)
(lambda (e)
(list a c e b d))))))
Here we go:
(define (symbol<? a b)
(string<? (symbol->string a)
(symbol->string b)))
(define-syntax curry-finish
(syntax-rules ()
( (curry-finish (original ...) procedure)
(procedure original ...) )))
(define-syntax curry-helper
(syntax-rules ()
( (curry-helper (original ...) procedure parameter rest ...)
(lambda (parameter)
(curry-helper (original ...) procedure rest ...)) )
( (curry-helper (original ...) procedure)
(curry-finish (original ...) procedure) )))
(define-syntax curry
(lambda (x)
(syntax-case x ()
( (curry procedure parameter ...)
(with-syntax ( ((sorted ...)
(datum->syntax
(syntax procedure)
(list-sort symbol<?
(syntax->datum
(syntax (parameter ...)))))) )
(syntax
(curry-helper (parameter ...) ;; original
procedure
sorted ...))) ))))