Mindfuck 'o clock pasted by sjamaan on Sat Dec 14 18:04:41 2013
;; Broken version (let-syntax ((foo (syntax-rules () ((_) (letrec-syntax ((bar (er-macro-transformer (lambda (e r c) (if (= (cadr e) 0) 0 `(,(r '+) 1 (,(r 'bar) ,(- (cadr e) 1)))))))) (bar 5)))))) (foo)) ;; Correct version (let-syntax ((foo (syntax-rules () ((_) (letrec-syntax ((bar (er-macro-transformer (lambda (e r c) (if (= (caddr e) 0) 0 `(,(r '+) 1 (,(cadr e) ,(cadr e) ,(- (caddr e) 1)))))))) (bar bar 5)))))) (foo))
The same, as macro-rules and a similar one as syntax-rules added by sjamaan on Sat Dec 14 18:13:24 2013
(let-syntax ((foo (syntax-rules () ((_) (letrec-syntax ((bar (macro-rules () ((_ recur x) (where (= x 0)) 0) ((_ recur x) `(+ 1 (,recur ,recur ,(- x 1))))))) (bar bar 5)))))) (foo)) ;; Much more fun: no need to pass the macro its own name (let-syntax ((foo (syntax-rules () ((_) (letrec-syntax ((bar (syntax-rules .. () ((_) 0) ((_ x rest ..) (+ 1 (bar rest ..)))))) (bar 1 2 3 4 5)))))) (foo))