Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (define (procedure1)
- (define exit-procs '())
- (define-syntax defer
- (syntax-rules ()
- ((defer (proc))
- (set! exit-procs (cons (cons proc '()) exit-procs)))
- ((defer (proc arg ...))
- (let ((evaluated-args (list arg ...)))
- (set! exit-procs (cons (cons proc evaluated-args)
- exit-procs))))))
- (dynamic-wind
- (lambda () #f)
- (lambda ()
- (defer (display "Goodbye, world!\n"))
- (display "Hello, world!\n"))
- (lambda ()
- (display "Leaving procedure1.\n")
- (let loop ((p exit-procs))
- (cond ((pair? p)
- (let ((proc-and-args (car p))
- (rest (cdr p)))
- (let ((proc (car proc-and-args))
- (args (cdr proc-and-args)))
- (apply proc args)
- (loop rest)))))))))
- (procedure1)
- ;;; ❯ gosh defer.scm
- ;;; Hello, world!
- ;;; Leaving procedure1.
- ;;; Goodbye, world!
Advertisement
Add Comment
Please, Sign In to add comment