Skip to content

Instantly share code, notes, and snippets.

@ijp
Created December 9, 2013 21:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ijp/7881058 to your computer and use it in GitHub Desktop.
Save ijp/7881058 to your computer and use it in GitHub Desktop.
(import (rnrs)
(for (only (srfi :1) break) expand))
(define-syntax foo
(lambda (stx)
(define (no-vals f befores)
(let ((temps (generate-temporaries befores)))
#`(lambda #,temps
(#,f #,@(map list befores temps)))))
(define (yes-vals f befores afters)
(let ((temps-before (generate-temporaries befores))
(temps-after (generate-temporaries afters)))
#`(lambda #,temps-before
(let-values ((#,temps-after
(#,f #,@(map list befores temps-before))))
(values #,@(map list afters temps-after))))))
(syntax-case stx ()
[(_ function converter ...)
(let-values (((before after)
(break (lambda (x) (free-identifier=? x #'::))
#'(converter ...))))
(if (null? after)
(no-vals #'function before)
(yes-vals #'function before (cdr after))))])))
;; (foo cons 1+ 1+)
;; -> (lambda (x y) (cons (1+ x) (1+ y)))
;; (foo break identity cdr :: car car)
;; -> (lambda (f l)
;; (let-values (((a b) (break (identity f) (cdr l))))
;; (values (car a) (car b))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment