[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: dynamic-wind
From: |
Amirouche Boubekki |
Subject: |
Re: dynamic-wind |
Date: |
Sat, 08 Jul 2017 20:03:53 +0000 |
Héllo all!
On Wed, Jul 5, 2017 at 8:14 AM Catonano <address@hidden> wrote:
> My point is that the manual does not a good job of _introducing_ people to
> the concept of dynamic wind
>
> Especially people wo have not clear in mind a complete map of the use cases
> with relative possible solutions.
>
> The manual tends to be a very good reference for already educated people.
> But it's not as good in educating people in the first place, in my view.
>
Maybe you are right. Maybe [0] is missing some more usecases. I consider
dynamic-wind an advanced concept not required for usual hacking. It's like
"if you don't know what you are doing, don't use it"
[0]
https://www.gnu.org/software/guile/manual/html_node/Dynamic-Wind.html#Dynamic-Wind
2017-07-02 13:58 GMT+02:00 Chris Vine <address@hidden>:
>
> > On Sun, 2 Jul 2017 08:00:58 +0200
> > > aahh I see now
> > >
> > dynamic-wind is much more general than just for dealing with database or
> > network connections, which I think would be a poor focus for the manual.
> >
>
> I was not suggesting to _narrow_ the focus of the manual
>
> I was suggesting to use a more mundane example as an _introduction_ to the
> functionality of dynamic wind
>
> The current example could still be given, maybe as the last one
>
> A general principle for the Wikipedia pages is to use an informal
> description first and then move on to more formal discssion later in the
> page
>
> To allow both audiences (interested in a quick overview and interested in a
> deeper analisys) to be served
>
> So I was thinking that the same principle could be used for the discussion
> of dynamic wind
>
I agree with you. A small introduction and a deeper look should both make
up the manual for each entry. That's said, the current page does in fact
have an introduction but starts with some C stuff which I don't understand,
which is why I prolly only skimmed over it the first time. Also the whole
article only cite call/cc in the example. My understanding now is that
dynamic-wind is only useful if you do use call/cc or one of its surrogate.
So call/cc should appear be in the introduction paragraph.
> That seems to confirm my view that the manual is not a great introduction
>
You are prolly more informed than me. I learned scheme from r7rs small
paper [1] and I use the manual mainly as a reference.
[1] http://trac.sacrideo.us/wg/raw-attachment/wiki/WikiStart/r7rs.pdf
>
> That said, Amirouche observed that in his Wiredtiger access layer, a state
> depending on the db is created and when leaving the dynamic wind context
> that sould be unrolled
>
> When reentering it should be properly reproduced
>
> He also considered taht probably in his case, the oprtions of leaving the
> context because of an exception and because of an intentional step should
> be treated diferently, as you observed
>
Indeed, in wiredtiger the with-context procedure which is not perfect, but
still does the job is implemented as follow:
(define-syntax-rule (with-context env body ...)
(let ((env* env))
;; get or create a context and set it as current *context* value
(let ((context (get-or-create-context env*)))
(with-fluids ((*context* context))
;; execute the body
(call-with-values
(lambda () (begin body ...))
(lambda out
;; push back the context to the context pool
(with-mutex (env-mutex env*)
(env-contexts! env* (cons context (env-contexts env*))))
(apply values out)))))))
(define-syntax-rule (with-context* body ...)
(let ((env (fluid-ref *env*)))
(with-context env body ...)))
(define-syntax-rule (with-env env body ...)
(let ((env* env))
(with-fluids ((*env* env*))
(call-with-values
(lambda () (with-context* body ...))
(lambda out
(env-close env*)
(apply values out))))))
It's inspired from ports procedures [2]. Like it tried to explain to
Catonano it's wrong to say that all with-fu procedure must be written using
dynamic wind. A proof of that is the port procedures in [2]. In fact, if
you can't re-compute the state before the dynamic context is escaped,
dynmaic wind is useless, which is the case of wiredtiger's with-context.
[2] http://git.savannah.gnu.org/cgit/guile.git/tree/module/ice-9/ports.scm
>
>
> > Having said all that, dynamic-wind is not the answer to all cases where
> > control leaves a block of code non-locally. It is best suited to cases
> > where invocation of a continuation object or the raising of an
> > exception fall to be dealt with in the same way, say by releasing a
> > resource such as by unlocking a mutex or closing a port. But that is by
> > no means always the case - the invocation of a continuation object is
> > usually a deliberate programmatic strategy, whereas the raising of an
> > exception is usually not so and instead represents an unexpected
> > failure event of some kind in the program.
>
>
> Wrapping up: I concede that dynamic wind is more general than network or
> dbs, and that doesn't even exhaust the whole range of possible cases
> (thanks !)
>
> But the manual could be improved nonetheless (unless it is meant to NOT be
> a tutorial)
>
> One last note: Amirouche lost this thread in his email client and asked me
> to post something so he can recuperate this thread and intervene, perhaps
>
I figured I have a backup solution in my gmail account...