{"id":"xmpnad","deleted":false,"future_paste":false,"expired":false,"language":"racket","created_at":"2024-10-18 02:28:00","expires_at":null,"content":"(define-syntax curried\r\n  (syntax-rules ()\r\n    [(_ () exp ...)\r\n     (lambda args\r\n       (if (null? args)\r\n           (begin exp ...)\r\n           (apply (begin exp ...) args)))]\r\n    [(_ (x x1 ...) exp ...)\r\n     (letrec ([rec (case-lambda\r\n                     [() rec]\r\n                     [(x x1 ...) (begin exp ...)]\r\n                     [(x x1 ... . rest) (apply (rec x x1 ...) rest)]\r\n                     [fewer-args\r\n                      (let ([waiting-for-more\r\n                             (lambda (rec fewer-args)\r\n                               (lambda more-args (apply rec (append fewer-args more-args))))])\r\n                        (waiting-for-more rec fewer-args))])])\r\n       rec)]\r\n    [(_ (x x1 ... . rest) exp ...)\r\n     (letrec ([rec (case-lambda\r\n                     [() rec]\r\n                     [(x x1 ... . rest) (begin exp ...)]\r\n                     [fewer-args\r\n                      (let ([waiting-for-more\r\n                             (lambda (rec fewer-args)\r\n                               (lambda more-args (apply rec (append fewer-args more-args))))])\r\n                        (waiting-for-more rec fewer-args))])])\r\n       rec)]\r\n    [(_ args exp ...) (lambda args exp ...)]))\r\n\r\n(define-syntax define-curried\r\n  (syntax-rules ()\r\n    [(_ (f . args) . body) (define f (curried args . body))]))\r\n"}