[gambit-list] Parameter objects performance Q
Jörg F. Wittenberger
Joerg.Wittenberger at softeyes.net
Fri Mar 13 10:10:09 EDT 2020
Am Thu, 12 Mar 2020 14:44:03 +0800
schrieb Adam <adam.mlmb at gmail.com>:
> On Wed, 11 Mar 2020 at 19:39, Jörg F. Wittenberger <
> Joerg.Wittenberger at softeyes.net> wrote:
> [...]
> > In practice I'm much easier confused understanding code with dynamic
> > scope applies than code where lexical scope rules.
>
> As for me I find the parameter objects highly intuitive.
YMMV.
I must admit that I did not quite understand all of your remarks:
> The teleport example I included in my third post in this thread,
> reflects what I use parameter objects for. Again:
>
> (define (a)
> > ; Teleport from hr
> > (b))
> > (define (b) (c))
> > (define (c)
> > ; Teleport to hr
> > #!void)
This for instance. Which "hr" you mean?
> including a hundred arguments would be too verbose
Recall, when assigning "hundreds of arguments" to parameters, that
parameters are expensive. (Can you, e.g., group them into records?)
> arguments (e.g. in the example above, the |b| procedure does not need
> to define as arguments the values teleported from |a| to |c|).
>
> The |doit!| example you provided does not illustrate this particular
> utility,
Sorry for that. I actually meant "doit!" to show that a 0-ari
procedure whould have access to parameters bound by `parameterize`.
However I badly failed to put an intermediate procedure in between.
Nevertheless: the "doit!" should do the expected thing. The "dare!"
was meant to look incredibly simillar and still _appear_ to ignore the
parameterize. (However: If you where to follow the dynamic-wind chain,
you'd see that the bindings are unwound for the "dare!"-call and
rewound afterwards.)
> comprehend what your |magic| procedure does so can't comment on it.
Here a slight rewrite:
(define (call-with-current-dynamic-extent proc)
;; patterned after call/cc
(proc
(call-with-current-continuation
(lambda (return)
(call-with-values
(lambda ()
(call-with-current-continuation
(lambda (c)
(return
(lambda (thunk)
(call-with-current-continuation
(lambda (k)
(c k thunk))))))))
(lambda (k thunk)
(call-with-values thunk k)))))))
(define (dynamic f)
;; convert `f` into a version which restores the dynamic envt first
(call-with-current-dynamic-extent
(lambda (dynamic-extent)
(lambda args
(dynamic-extent
(lambda () (apply f args)))))))
(define magic dynamic)
> additional consideration (unclear of details in this moment). call/c
> is not so frequently used though and its use does mean that
Except, maybe, in exception handling etc.
Best
Jörg
More information about the Gambit-list
mailing list