Eduardo Cavazos wrote:
What would be *really* cool is if it curried according to the sorted
order of the letters.
OK, I should probably call it something besides curry at this point. :-)
----------------------------------------------------------------------
(define (symbol<? a b)
(string<? (symbol->string a)
(symbol->string b)))
(define-syntax curry-finish
(lambda (x)
(syntax-case x ()
( (curry-finish (saved ...) procedure)
(with-syntax ( ((sorted ...)
(datum->syntax
(syntax procedure)
(list-sort symbol<?
(syntax->datum (syntax (saved
....)))))) )
(syntax
(procedure sorted ...))) ))))
(define-syntax curry-helper
(syntax-rules ()
( (curry-helper (saved ...) procedure parameter rest ...)
(lambda (parameter)
(curry-helper (saved ... parameter) procedure rest ...)) )
( (curry-helper (saved ...) procedure)
(curry-finish (saved ...) procedure) )))
(define-syntax curry
(syntax-rules ()
( (curry procedure parameter ...)
(curry-helper () procedure parameter ...) )))
----------------------------------------------------------------------
Examples:
> (((curry / a b) 5) 6)
5/6
> (((curry / b a) 5) 6)
6/5
> (define subtract-from (curry - a b))
> (subtract-from 5)
#<procedure>
> ((subtract-from 5) 1)
4
> (define divide-by (curry / b a))
> (divide-by 5)
#<procedure>
> ((divide-by 5) 10)
2
Ed