;; from c.l.scheme puzzle ;; ;; Gauche recursive let barfs on it... (let* ((yin ((lambda (foo) (newline) foo) (call/cc (lambda (bar) bar)))) (yang ((lambda (foo) (write-char #\*) foo) (call/cc (lambda (bar) bar))))) (yin yang)) ;; Shiro's hand-expanded version (let* -> lambda) works, however: ((lambda (yin) ((lambda (yang) (yin yang)) ((lambda (foo) (write-char #\*) foo) (call/cc (lambda (bar) bar))))) ((lambda (foo) (newline) foo) (call/cc (lambda (bar) bar)))) ;; adapted from $librep/lisp/rep/lang/interpreter.jl ;; a macro to rewrite let* directly to lambda (define-macro (let* . args) (let loop ((rest (reverse (car args))) (body (cons 'begin (cdr args)))) (cond ((null? rest) body) (else (loop (cdr rest) `((lambda ,(list (caar rest)) ,body) ,@(cdar rest)))))))