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