22 lines
709 B
Plaintext
22 lines
709 B
Plaintext
(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)))
|