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 ...))) ))))


Reply via email to