(define-syntax with (syntax-rules "use a context manager. Takes a value, name and body and binds value to name in body. Ensures resource cleanup. params: - val: the value to bind - var: the name to bind to - body: varargs for the body complexity: O(1) returns: the result of the resource cleanup" () ((_ val var body ...) (let ((var val)) (begin body ... (teardown var)))))) (defprotocol context-manager (teardown 1)) (defimpl context-manager input-port? ((teardown close-input-file))) (defimpl context-manager output-port? ((teardown close-output-file))) (defimpl context-manager net:socket? ((teardown net:close-socket)))