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

Reply via email to