(define-library (srfi 26) (import (scheme base) (picrin macro) (srfi 1)) (define-syntax cut% (ir-macro-transformer (lambda (form inject compare?) (let ((slots (second form)) (combi (third form)) (se (cdddr form))) (cond ((null? se) `(lambda ,slots ((begin ,(car combi)) ,@(cdr combi)))) ((and (symbol? (car se)) (compare? (car se) '<...>)) `(lambda (,@slots . rest-slot) (apply ,@combi rest-slot))) ((and (symbol? (car se)) (compare? (car se) '<>)) `(cut% (,@slots x) (,@combi x) ,@(cdr se))) (else `(cut% ,slots (,@combi ,(car se)) ,@(cdr se)))))))) (define-syntax cute% (ir-macro-transformer (lambda (form inject compare?) (let ((slots (second form)) (binds (third form)) (combi (fourth form)) (se (cddddr form))) (cond ((null? se) `(let ,binds (lambda ,slots ((begin ,(car combi)) ,@(cdr combi))))) ((and (symbol? (car se)) (compare? (car se) '<...>)) `(let ,binds (lambda (,@slots . rest-slot) (apply ,@combi rest-slot)))) ((and (symbol? (car se)) (compare? (car se) '<>)) `(cute% (,@slots x) ,binds (,@combi x) ,@(cdr se))) (else `(cute% ,slots ((x ,(car se)) ,@binds) (,@combi x) ,@(cdr se)))))))) (define-syntax cut (ir-macro-transformer (lambda (form inject compare?) `(cut% () () ,@(cdr form))))) (define-syntax cute (ir-macro-transformer (lambda (form inject compare?) `(cute% () () () ,@(cdr form))))) (export cut cute))