121 lines
2.5 KiB
Text
121 lines
2.5 KiB
Text
|
#lang scribble/manual
|
||
|
@(require (for-label racket))
|
||
|
|
||
|
@title{LazyEnvir}
|
||
|
lazy environment@section{categories}
|
||
|
Libraries>JITLib>Environments, Live Coding, Collections>Unordered
|
||
|
@section{related}
|
||
|
Classes/Maybe, Classes/Fdef, Classes/Environment, Classes/ProxySpace, Overviews/JITLib
|
||
|
|
||
|
@section{description}
|
||
|
|
||
|
Environment with deferred evaluation and default values.
|
||
|
|
||
|
Consequently, calculations can be done with nonexisting objects which can then be assigned later.
|
||
|
Per default, a LazyEnvir returns instances of link::Classes/Maybe::. See also link::Classes/Fdef::.
|
||
|
|
||
|
@section{note}
|
||
|
While the method put is treated as transparent and implicitly creates a placeholder, all other methods, like at, collect, do, etc. pass the placeholder. In order to retrieve the object itself, use .source - in order to reduce it to a value, use: value::
|
||
|
|
||
|
|
||
|
@racketblock[
|
||
|
e = LazyEnvir.new;
|
||
|
e.use { ~x = ~y + ~z };
|
||
|
e.at(\x);
|
||
|
e.at(\x).source; // the source is a binary operation (addition on the placeholders)
|
||
|
e.use { ~y = 5; ~z = 7 };
|
||
|
e.at(\x).value; // the value is 12
|
||
|
::
|
||
|
|
||
|
]
|
||
|
@section{InstanceMethods}
|
||
|
|
||
|
|
||
|
@section{method}
|
||
|
put
|
||
|
Sets the value of the reference at key.
|
||
|
|
||
|
@section{method}
|
||
|
at
|
||
|
Returns a reference to the object at key.
|
||
|
|
||
|
|
||
|
@racketblock[
|
||
|
l = LazyEnvir.push;
|
||
|
|
||
|
// default objects are created on access
|
||
|
~a;
|
||
|
~a.value; // defaults to nil
|
||
|
|
||
|
// operations on placeholders
|
||
|
(
|
||
|
~c = ~a + ~b;
|
||
|
|
||
|
~c.value; // doesn't fail, instead returns nil
|
||
|
)
|
||
|
|
||
|
// variables can be assigned later
|
||
|
(
|
||
|
~a = 800;
|
||
|
~b = { 1.0.rand };
|
||
|
|
||
|
~c.value;
|
||
|
)
|
||
|
|
||
|
// variables can be exchanged later
|
||
|
(
|
||
|
~b = { 1000.rand };
|
||
|
~c.value;
|
||
|
)
|
||
|
::
|
||
|
|
||
|
]
|
||
|
@section{method}
|
||
|
copy
|
||
|
Copies the environment into a new one, with each placeholder being copied as well.
|
||
|
|
||
|
@section{method}
|
||
|
localPut
|
||
|
Sets the value of the key directly. This method is mainly used internally.
|
||
|
|
||
|
@section{method}
|
||
|
proxyClass
|
||
|
Specify what placeholder object the environment uses by supplying a class name (link::Classes/Symbol::). The default is a link::Classes/Maybe::. Any object that responds to the methods source, source_ and clear can be a placeholder.
|
||
|
|
||
|
|
||
|
@racketblock[
|
||
|
|
||
|
// making a pattern space using LazyEnvir
|
||
|
|
||
|
a = LazyEnvir.new;
|
||
|
a.proxyClass=\PatternProxy;
|
||
|
|
||
|
a.push;
|
||
|
|
||
|
~x = Pseq([1, 2, 30], 1);
|
||
|
~y = Pseq([~x], inf);
|
||
|
|
||
|
z = ~y.asStream;
|
||
|
|
||
|
z.next;
|
||
|
z.next;
|
||
|
z.next;
|
||
|
~x = Pseq([100, 2, 300], 1);
|
||
|
z.next;
|
||
|
z.next;
|
||
|
z.next;
|
||
|
|
||
|
a.pop;
|
||
|
::
|
||
|
|
||
|
]
|
||
|
@section{method}
|
||
|
removeAt
|
||
|
Removes the placeholder from the environment and clears it.
|
||
|
|
||
|
@section{method}
|
||
|
makeProxy
|
||
|
Returns a new placeholder object. This is used internally and can be overridden to implement other lazy environments.
|
||
|
|
||
|
|