guile-user
[Top][All Lists]
Advanced

[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...


reply via email to

[Prev in Thread] Current Thread [Next in Thread]