Hi Marc,
Cool, wonderful!
Yeah for any situation like
(define (a) ; Teleport from hr (b)) (define (b) (c)) (define (c) ; Teleport to hr #!void)
, just totally great.
Your subsequent email re. "(make-timeout-handler 5 (lambda () …))))" usecase and "I think that is a better API." comment I believe I fully agree with, also that's neat, it illustrates how this is useful on the runtime-interacts-with-userland level.
Thinking back, all my parameter objects until now have been global variables. This also means that, for a given sourcecode file, the number of parameter objects has been pre-specified. In this kind of usage situation, would any optimization trick be possible? E.g. could the "current input port or one of the last 3 accessed parameters" set be extended with a copy of each of that fixed set of toplevel parameter objects and so accordingly their parameterization and access be O(1) always.
(This email was primarily to learn what kind of time characteristics parameterized objects have, given how great they are.)
Adam
On Sun, 8 Mar 2020 at 23:00, Marc Feeley feeley@iro.umontreal.ca wrote:
The dynamic environment is implemented as a hybrid structure that combines a dictionary (implemented as a binary tree), with a special case for the frequently accessed parameters (current-input-port, etc), and a cache of the last 3 parameters that were accessed.
So if you access the current input port or one of the last 3 accessed parameters, the time complexity is O(1). Otherwise it is O(log N) where N is the number of bindings in the environment.
I may change the binary tree to a table once the functional API to tables is fully implemented.
So I think the complexity is pretty good, but obviously much slower than an access to a lexical variable. I’ll let you do some benchmarking to determine the hidden constant.
Marc
On Mar 8, 2020, at 10:44 AM, Adam adam.mlmb@gmail.com wrote:
Hi Marc,
I can't recall if this is somewhere in the mailing list archive from
before:
I recall that you indicated that parameter objects are expensive.
Would you mind describing/quantifying the average/worst case/best case
cost for assigning a value to a parameter object by parameterization (|parameterize|), and for accessing a parameter object (load or store operation by invoking it as a closure)?
Parameter objects are very practical and have ample use scenarios, both
high-level and relatively low-level.
Thanks, Adam