let/cc -> which is better? pasted by DeeEff on Mon Jan 11 00:45:07 2016
;;; VERSION 1 ;;; (define-syntax let/cc (ir-macro-transformer (lambda (expr inject compare) (let ([escape (cadr expr)] [body (cddr expr)]) `(call/cc (lambda (,(inject escape)) ,@(inject body))))))) (expand '(let/cc k ((lambda (d) (k d)) 1))) ;; (call/cc239 (lambda237 (k236) ((lambda237 (d238) (k236 d238)) 1))) ;;; VERSION 2 ;;; (define-syntax let/cc (ir-macro-transformer (lambda (expr inject compare) (let ([escape (cadr expr)] [body (cddr expr)]) `(call/cc (lambda (,escape) ,@body)))))) (expand '(let/cc k ((lambda (d) (k d)) 1))) ;; (call/cc253 (lambda251 (k) ((lambda (d) (k d)) 1)))
Counter-example added by sjamaan on Mon Jan 11 19:16:12 2016
;; This should be identical to (print 1) ;; It simply ignores the continuation (let ((lambda print)) (let/cc k (lambda 1)))