chemoelectric

‘defer’ version 2

Sep 19th, 2025 (edited)
3,446
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 0.97 KB | Source Code | 0 0
  1. (define (procedure1)
  2.   (define exit-procs '())
  3.   (define-syntax defer
  4.     (syntax-rules ()
  5.       ((defer (proc))
  6.        (set! exit-procs (cons (cons proc '()) exit-procs)))
  7.       ((defer (proc arg ...))
  8.        (let ((evaluated-args (list arg ...)))
  9.          (set! exit-procs (cons (cons proc evaluated-args)
  10.                                 exit-procs))))))
  11.   (dynamic-wind
  12.     (lambda () #f)
  13.     (lambda ()
  14.       (defer (display "Goodbye, world!\n"))
  15.       (display "Hello, world!\n"))
  16.     (lambda ()
  17.       (display "Leaving procedure1.\n")
  18.       (let loop ((p exit-procs))
  19.         (cond ((pair? p)
  20.                (let ((proc-and-args (car p))
  21.                      (rest (cdr p)))
  22.                  (let ((proc (car proc-and-args))
  23.                        (args (cdr proc-and-args)))
  24.                    (apply proc args)
  25.                    (loop rest)))))))))
  26.  
  27. (procedure1)
  28.  
  29. ;;; ❯ gosh defer.scm
  30. ;;; Hello, world!
  31. ;;; Leaving procedure1.
  32. ;;; Goodbye, world!
  33.  
Advertisement
Add Comment
Please, Sign In to add comment