В теоретической информатике есть такая штука как CK-автомат. Помимо написания заумных статей, у него есть и более приземлённое предназначение. Он позволяет записывать call-by-value макросы в Scheme.
Вот, собственно, он:
(define-syntax $
(syntax-rules (quote)
(($ e) ($ () e))
(($ () 'v) v)
(($ (((! ...) a ...) . s) 'v) ($ s #f (! ... 'v) a ...))
(($ s #f (! va ...)) (! s va ...))
(($ s #f (! ...) 'v a ...) ($ s #f (! ... 'v) a ...))
(($ s #f (! ...) a aa ...) ($ (((! ...) aa ...) . s) a))
(($ s (! a ...)) ($ s #f (!) a ...)) ) )
(define-syntax $cons
(syntax-rules (quote)
((_ s 'a 'd) ($ s '(a . d)))) )
(define-syntax $map
(syntax-rules (quote)
((_ s 'f '() ...) ($ s '()))
((_ s 'f '(a . d) ...) ($ s ($cons (f 'a ...) ($map 'f 'd ...)))) ) )
(define-syntax $filter
(syntax-rules (quote)
((_ s 'p '()) ($ s '()))
((_ s 'p '(a . d)) (p a ($ s ($cons 'a ($filter 'p 'd)))
($ s ($filter 'p 'd)) )) ) )
(define-syntax $quote
(syntax-rules (quote)
((_ s 'x) ($ s ''x)) ) )
(define-syntax ?bool
(syntax-rules ()
((_ #f t f) t)
((_ #t t f) t)
((_ :: t f) f) ) )
(define-syntax ?symbol
(syntax-rules ()
((_ (a . d) t f) f)
((_ #(x ...) t f) f)
((_ a-symbol t f)
(let-syntax
((? (syntax-rules ()
((_ a-symbol tt ff) tt)
((_ else tt ff) ff) )))
(? ! t f) )) ) )
($ ($quote
($map '$cons
($filter '?symbol '(a b 1 2))
($filter '?bool '(3 #t #f 4)) ) )) ===> '((a . #t) (b . #f))