(Arne Babenhauserheide)
2017-03-24: adjust with to use dynamic-wind. Don’t know how to test this yet. adjust with to use dynamic-wind. Don’t know how to test this yet.
diff --git a/examples/with.w b/examples/with.w --- a/examples/with.w +++ b/examples/with.w @@ -13,27 +13,44 @@ define-module : examples with import : oop goops -define : enter thing +define : enter thing state . thing define-generic enter -define : exit thing +define : exit thing state . thing define-generic exit define-syntax with syntax-rules : as : _ thing as name thunk ... - let* - : name : enter thing - res : begin thunk ... - exit thing - . res + let + : name #f + state #f + res #f + dynamic-wind + λ () : set! name : enter thing state + λ () : set! res : begin thunk ... + . res + λ () ; : exit thing state + . res -define-method : exit (thing <port>) +define-method : enter (thing <port>) state . "Ensure that a port is always closed at the end of the with-block." + when : not : equal? #f state + set-port-column! thing (car state) + set-port-line! thing (car (cdr state)) + . thing + +define-method : exit (thing <port>) state + . "Ensure that a port is always closed at the end of the with-block." + set! state : list (port-line thing) (port-column thing) close-port thing define : main args with (open-file "with.w" "r") as port format #t "~a\n" : read port + format #t "~a\n" : read port + format #t "~a\n" : read port + + ;; TODO: test-continuation