diff --git a/src/lib/iter-tree-explorer.hpp b/src/lib/iter-tree-explorer.hpp index ce35330b0..889e4c75c 100644 --- a/src/lib/iter-tree-explorer.hpp +++ b/src/lib/iter-tree-explorer.hpp @@ -488,7 +488,6 @@ namespace lib { void expandChildren() { } size_t depth() const { return 0; } - }; @@ -514,7 +513,7 @@ namespace lib { * @tparam SRC the wrapped source iterator, typically a TreeExplorer or nested decorator. * @tparam FUN the concrete type of the functor passed. Will be dissected to find the signature */ - template + template class Expander : public SRC { @@ -537,9 +536,7 @@ namespace lib { : SRC{move (parentExplorer)} // NOTE: slicing move to strip TreeExplorer (Builder) , expandChildren_{forward (expandFunctor)} , expansions_{} - { - maybeExpandToExhaustion(); - } + { } /** core operation: expand current head element */ @@ -555,22 +552,6 @@ namespace lib { expansions_.push (move(expanded)); } - void - maybeExpandToExhaustion() - { - if (not (expandToLeaf and this->checkPoint())) return; - - while (true) - { - ResIter expanded{ 0 < depth()? expandChildren_(*expansions_) - : expandChildren_(*this)}; - if (isnil(expanded)) - break; - iterate(); // consume current head element - expansions_.push (move(expanded)); - } - } - /** diagnostics: current level of nested child expansion */ size_t depth() const @@ -597,13 +578,6 @@ namespace lib { void iterNext() - { - iterate(); - maybeExpandToExhaustion(); - } - - void - iterate() { if (0 < depth()) { @@ -618,6 +592,14 @@ namespace lib { + /** + * @internal extension to the Expander decorator to perform expansion automatically on each iteration step. + * @todo as of 12/2017, this is more like a proof-of concept and can be seen as indication, that there might + * be several flavours of child expansion. Unfortunately, most of these conceivable extensions would + * require a flexibilisation of Expander's internals and thus increase the complexity of the code. + * Thus, if ever encounter the need of anything beyond the basic expansion pattern, we should + * rework the design of Expander and introduce building blocks to define the evaluation strategy. + */ template class AutoExpander : public SRC @@ -1007,20 +989,15 @@ namespace lib { } - /** @todo WIP 12/17 auto expand down to the leafs - */ - template - auto - expandLeaf (FUN&& expandFunctor) - { - using ResCore = iter_explorer::Expander; - using ResIter = typename _DecoratorTraits::SrcIter; - - return TreeExplorer (ResCore {move(*this), forward(expandFunctor)}); - } - - - /** @todo WIP 12/17 auto expand all + /** extension functionality to be used on top of expand(), to perform expansion automatically. + * When configured, child elements will be expanded on each iteration step; it is thus not + * necessary to invoke `expandChildren()` (and doing so would have no further effect than + * just iterating). Thus, on iteration, each current element will be fed to the _expand functor_ + * and the results will be integrated depth first. + * @warning iteration will be infinite, unless the _expand functor_ provides some built-in + * termination condition, returning an empty child sequence at that point. This would + * then be the signal for the internal combination mechanism to return to visiting the + * results of preceding expansion steps, eventually exhausting all data source(s). */ auto expandAll() diff --git a/src/proc/engine/job-planning.hpp b/src/proc/engine/job-planning.hpp index 84bce4025..011a0e0ff 100644 --- a/src/proc/engine/job-planning.hpp +++ b/src/proc/engine/job-planning.hpp @@ -42,11 +42,11 @@ ** there is always just a single JobPlanning element, which represents the \em current element; this element ** lives as "state core" within the PlanningState object. Advancing to the next JobPlanning element (i.e. to ** consider the next job or prerequisite job to be planned for scheduling) is performed through the iteration - ** control API exposed by JobPlanning (the free functions \c checkPoint, \c yield and \c iterNext. Actually, + ** control API exposed by JobPlanning (the functions `checkPoint()`, `yield()` and `iterNext()`. Actually, ** these functions are invoked through the depth-first tree exploration performed by JobPlaningSequence. ** The implementation of these invocations can be found within the IterExplorer strategy ** lib::iter_explorer::RecursiveSelfIntegration. The net result is - ** - the current element is always accessed through \c yield + ** - the current element is always accessed through `yield()` ** - advancing to the next element happens \em either ** ** - by invoking `iterNext()` (when processing a sequence of sibling job prerequisites) diff --git a/tests/library/iter-tree-explorer-test.cpp b/tests/library/iter-tree-explorer-test.cpp index da6b841f4..ff7e23755 100644 --- a/tests/library/iter-tree-explorer-test.cpp +++ b/tests/library/iter-tree-explorer-test.cpp @@ -802,7 +802,23 @@ namespace test{ } // note how the remainder of the original sequence is picked up with 'J'... - /** @test use a preconfigured exploration scheme to expand depth-first until exhaustion + + /** @test use a preconfigured exploration scheme to expand depth-first until exhaustion. + * This is a simple extension where all elements are expanded automatically. In fact, the + * `expandChildren()` operation implies already an iteration step, namely to dispose of the + * parent element before injecting the expanded child elements. Based on that observation, + * when we just replace the regular iteration step by a call to `expandChildren()`, we'll + * encounter first the parent element and then delve depth-first into exploring the children. + * @note such continued expansion leads to infinite iteration, unless the _expand functor_ + * contains some kind of termination condition. + * - in the first example, we spawn a child sequence with starting point one below + * the current element's value. And since such a sequence is defined to terminate + * when reaching zero, we'll end up spawning an empty sequence at leaf nodes, which + * prompts the evaluation mechanism to pop back to the last preceding expansion. + * - the second example demonstrates how to use value tuples for the intermediary + * computation. In this case, we only generate a linear chain of children, + * thereby summing up all encountered values. Termination is checked + * explicitly in this case, returning an empty child iterator. */ void verify_depthFirstExploration() @@ -826,18 +842,18 @@ namespace test{ : SingleValIter(); }; - cout << materialise( + CHECK (materialise( treeExplore(CountDown{4}) .transform([](uint i){ return Tu2{i,0}; }) - .expandLeaf(summingExpander) + .expand(summingExpander) + .expandAll() .transform([](Tu2 res){ return get<1>(res); }) - ) <
+
+
//Monads are of questionable usefullness//
+
+Monads are a concept and theoretical framework from category theory.
+But the use of Monads as a programming construct is much touted in the realm of functional programming -- which unfortunately is riddled with some kind of phobia towards ''State''.
+And this in itself is ill-guided, since //not State is the problem,// ''Complexity'' is. Complexity arises from far reaching non local interdependencies and coupling. Some complexity is essential.
+
+A telltale sign is that people constantly ask »What is a Monad?«
+And they don't get an answer, rather they get a thousand answers.
+The term //"Monad" fails to evoke an image// once mentioned.
+
+What remains is a set of clever technicalities. Such can be applied and executed without understanding. The same technicality can be made to work on vastly distinct subjects. And a way to organise such technicalities can be a way to rule and control subjects. The exertion of control is not in need of invoking images, once its applicability is ensured. //That// state is indifferent towards complexity, at least.
+
+When we care for complexity, we do so while we care for matters tangible to humans. Related to software, this is the need to maintain it, to adjust it, to adapt and remould it, to keep it relevant. At the bottom of all of these is the need to understand software. And this mandates to use terms and notions, even patterns, which evoke meaning -- even to the uninitiated. How can Monads even be helpful with that?
+
+!To make sensible usage of Monads
+Foremost, they should be kept as what they are: technicalities. For the understanding, they must be subordinate to a real concept or pattern. One with the power to reorient our view of matters at hand.
+Thus we ask: what can be said about Monads?
+
+!!!Formalism
+Regarding the formalism, it should be mentioned
+* that a Monad is a //type constructor// -- it takes a type parameter and generates a new instant of monadic kind.
+* and assuming such an instance, there is a //constructor// <br>{{{
+   unit: A → M<A>
+   }}}
+* and once we've optained a concrete entity of type {{{M<A>}}}, we can //bind a function// to transform it in another monadic entity<br/>{{{
+   M<A>::bind( A → M<B> ) → M<B>
+   }}}
+At this point, also the ''Monad Axioms'' should be mentioned
+;neutrality
+:{{{unit}}} (the monad constructor) is neutral with respect to the {{{bind}}} operation
+{{{
+unit(a)::bind(f)  ≡  f(a)
+M::bind(unit)  ≡  M
+}}}
+;composition
+:we can define a //composition// of monadic functions,
+:which is equivalent to consecutive binding
+{{{
+(M::bind(f) )::bind(g)  ≡  M::bind( f ∘ g )     with f ∘ g  defined as λ.x → { f(x)::bind(g) }
+}}}
+
+!!!Distinct properties
+The obvious first observation is that a Monad must be some kind of //container// -- or //object,// for that.
+
+The next observation to spring into mind is the fact that the {{{bind}}}-operation is notoriously hard to understand.
+Why is this so? Because it //intermingles// the world of monads with the things from the value domain. You can not just write a monadic function for use with {{{bind}}}, without being aware of the world of monads. It is not possible to "lift" an operation from the world of values automatically into the world of monads. Please contrast this to the ''map operation'', which is easy to understand for that very reason: if you map an operation onto a container of values, the operation itself does not need to be aware of the existence of containers as such. It just operates on values.
+
+This observation can be turned into a positive use-case for monadic structures -- whenever there is an ''additional cross-cutting concern'' within the world of values, to necessitate our constant concern all over the place. The Monad technique can then be used to re-shuffle this concern in such a way that it becomes possible to keep it //mentally separate.// Thus, while it is not possible to //remove// that concern, re-casting it as Monad creates a more regular structure, which is easier to cope with. A Monad can thus be seen as an ''augmented or "amplified" value''. A value outfitted with additional capabilities. This view might be illustrated by looking at some of the most prominent applications
+;failure handling
+:when we mark an expression as prone to failure by wrapping it into some //exception handling monad,//
+:it becomes easy to combine several such unreliable operations into a single program unit with just one failure handler
+;partially defined operations
+:when an operation can only work on some part of the value domain, we can mark the result as //optional//
+:and combining several tasks with optional result into one chain of operations can then be done completely generic
+;multiple results
+:when some tasks might possibly produce multiple results, we can mark those with a //container monad,//
+:and collecting and combining of such multifold results can then be dealt with completely separate from the generating actions
+;secondary state attributions
+:when we have to observe, extend and communicate additional data beyond what is involved in the basic computation
+:the collection and management of such additional attributions can be externalised with a //state monad//
+;local technicalities
+:when some algorithm or computation involves specific technicalities to get at the underlying data
+:a monad can be used to encapsulate those details and expose only abstracted higher-level //operation primitives//
+
+!!!Building with monads
+As pointed out above, while all those disparate usages might share some abstract structural similarities, no overarching theme can be found to span them all. If we tend to distil an essence from all those usages, we're bound to end up with nothing. The reason is, //we do apply// monadic techniques while coping with the problem, but there is //nothing inherent "monadic" in the nature// of things at hand.
+
+Yet to guide our thinking and doing, when we deal with matters, other concepts, notions and patterns are better suited to guide our actions, because they concur with the inherent nature of things:
+;builder
+:a builder allows to assemble a very specific structure from building blocks,
+:when done, the structure is self-contained and can be operated and used devoid all intricacies involved in building.
+:Monads are //exceptionally viable// for performing this process of assembly within the builder.
+;domain specific language
+:a DSL can found a higher level of abstraction, where local handling details are stashed away.
+:Monads can be useful as supporting backbone below a DSL, especially in cases where a full language system and runtime engine would be overblown
+;abstract composite value
+:an abstract data type or complex value can be used to represent computations beyond simple numbers,
+:prominent examples being colours with colour space or measurement values with numerical precision and unit of measurement.
+:Monads can be used to build the basic combining operations on such custom types, and their interplay.
+;engine
+:an engine guides and enacts ongoing computations, thereby transitioning internal state
+:Monads can be used as blueprint for managing these internal state transitions, and to prevent them from leaking out into the target of processing
+;context
+:a (possibly global) context can be used to represent all further concerns, which need to be there as well.
+:Monads can be used to create a distinct, secondary system of communication (»wormhole«) and they can be used to capture and replay events.
+:beyond that, for most practical purposes, simple plain mutable variables plus nested scopes //are a solution superior to the application of Monads.//
+
+
PageTemplate
 |>|SiteTitle - SiteSubtitle|
@@ -2359,11 +2448,13 @@ Additionally, they may be used for resource management purposes by embedding a r
 #* one OpenGL Dataframe could contain raw texture data (but I am lacking expertise for this topic)
 
-
+
An entity within the RenderEngine, responsible for translating a logical [[calculation stream|CalcStream]] (corresponding to a PlayProcess) into a sequence of individual RenderJob entries, which can then be handed over to the [[Scheduler]]. Performing this operation involves a special application of [[time quantisation|TimeQuant]]: after establishing a suitable starting point, a typically contiguous series of frame numbers need to be generated, together with the time coordinates for each of those frames.
 
 The dispatcher works together with the job ticket(s) and the scheduler; actually these are the //core abstractions//&nbsp; the process of ''job planning'' relies on. While the actual scheduler implementation lives within the backend, the job tickets and the dispatcher are located within the [[Segmentation]], which is the backbone of the [[low-level model|LowLevelModel]]. More specifically, the dispatcher interface is //implemented//&nbsp; by a set of &rarr; [[dispatcher tables|DispatcherTables]] within the segmentation.
 
+{{red{stalled since 2014}}} -- development on this (important) topic has been postponed. Moreover, some rough edges remain within the Design &rarr; see [[some notes...|AboutMonads]]
+
 !defining the dispatcher interface
 The purpose of this interface is to support the planning of new jobs, for a given CalcStream. From time to time, a chunk of new RenderJob entries will be prepared for the [[Scheduler]]. Each job knows his frame number and the actual ProcNode to operate. So, to start planning jobs, we need to translate time &rarr; frame number &rarr; segment &rarr; real exit node.
 
@@ -3322,8 +3413,8 @@ Besides routing to a global pipe, wiring plugs can also connect to the source po
 Finally, this example shows an ''automation'' data set controlling some parameter of an effect contained in one of the global pipes. From the effect's POV, the automation is simply a ParamProvider, i.e a function yielding a scalar value over time. The automation data set may be implemented as a bézier curve, or by a mathematical function (e.g. sine or fractal pseudo random) or by some captured and interpolated data values. Interestingly, in this example the automation data set has been placed relatively to the meta clip (albeit on another track), thus it will follow and adjust when the latter is moved.
 
-
-
This wiki page is the entry point to detail notes covering some technical decisions, details and problems encountered in the course of the implementation of the Lumiera Renderengine, the Builder and the related parts.
+
+
This wiki page is the entry point to detail notes covering some technical decisions, details and problems encountered in the course of the years, while building the Lumiera application.
 
 * [[Packages, Interfaces and Namespaces|InterfaceNamespaces]]
 * [[Memory Management Issues|MemoryManagement]]
@@ -3357,6 +3448,8 @@ Finally, this example shows an ''automation'' data set controlling some paramete
 * designing how to [[build|BuildFixture]] the [[Fixture]] (...{{red{WIP}}}...)
 * from [[play process|PlayProcess]] to [[frame dispatching|FrameDispatcher]] and [[node invocation|NodeInvocation]]
 * how to shape the GuiConnection: with the help of a mediating GuiModel, which acts as UI-Bus, exchanging TreeDiffModel messages for GuiModelUpdate
+* shape the Backbone of the UI, the UI-Bus and the GuiTopLevel
+* build a framework for InteractionControl in the User Interface
 
@@ -4167,7 +4260,7 @@ The UI-Bus offers a dedicated API to direct ~MutationMessages towards {{{Tangibl In the case at hand, the basic building block of the Lumiera UI, the {{{Tangible}}} offers this interface and thus the ability to construct a concrete TreeMutator, which in turn is bound to the internals of the actual UI-Element in question. Together this allows for a generic implementation of MutationMessage handling, where the designated UI-Element is reshaped by applying a concrete diff sequence embedded in the message with the help of a {{{DiffApplicator<DiffMutable>}}}, based on the TreeMutator exposed.
-
+
//Service to navigate through the UI as generic structure.//
 The Navigator is a component maintained by the InteractionDirector, and the actual implementation is backed by several facilities of the GuiTopLevel. It serves as foundation to treat the UI as a topological network of abstracted locations, represented as [[UI-Coordinates|UICoord]]. This design, together with the UI-Bus helps to reduce coupling within the UI implementation, since it enables to //get somewhere// and reach //some place// -- without the necessity to rely on concrete widget implementation structure.
 
@@ -4196,8 +4289,40 @@ In the current situation ({{red{10/2017}}}), before engaging into the actual imp
 From these use cases we conclude that the actual requirements for a Navigator component are less than one might expect.
 In fact it is sufficient to keep //the actual element// entirely opaque, so the Navigator works on UI coordinates solely. The result -- some other UI coordinates -- can then be used to accomplish some tasks implemented elsewhere, like allocating a new view or actually moving [[the Spot|Spot]] (&rarr; InteractionControl)
 
+!Challenges of the implementation
+Some tricky problems remain to be solved, though: since the Navigator works on UI coordinates, the fundamental problem remains how to acquire the initial coordinates to start navigation. This is a problem of //reverse lookup:// given a concrete element of the UI, find it's UI coordinates. While we should note that it might not be necessary to "discover" coordinates, because in fact we may know them already -- either the element has to store them (on creation), or some lookup index table could be maintained to serve the same purpose//Service to navigate through the UI as generic structure.//
+The Navigator is a component maintained by the InteractionDirector, and the actual implementation is backed by several facilities of the GuiTopLevel. It serves as foundation to treat the UI as a topological network of abstracted locations, represented as [[UI-Coordinates|UICoord]]. This design, together with the UI-Bus helps to reduce coupling within the UI implementation, since it enables to //get somewhere// and reach //some place// -- without the necessity to rely on concrete widget implementation structure.
+
+!The problem of abstraction
+This goal initially poses some challenge, since it aims beyond the conventional notion of UI programming, where it is sufficient just to wire some widgets and manipulate the receiver of an event notification. The usual UI widgets are just not meant to be treated in a more systematic, generic way -- and indeed, in most cases and for most purposes it is not a good idea to approach UI programming in a to much schematic way. User interfaces need to be tangible, something concrete, with lots of specifics and local traits. Yet this very nature of UI programming tends to turn some //cross-cutting concerns// into serious liabilities. So the deliberate ''decision to introduce a Navigator'' in avoidance of these future burdens and liabilities is a decision of priorities when it comes to shaping the Lumiera UI.
+
+Which leaves us with the quest of mapping a generic location scheme onto a load of implementation defined structures not exposing any kind of genericness, and to accomplish this within an environment lacking meta information and support for self discovery beyond the most basic abstraction level. As a first step towards bridging this gap, we'll have to identify the actual //command-and-query operations// required to treat UI elements as a topological structure.
+
+!!!Analysis of expected functionality
+In order to build a navigation facility, we need to...
+* follow a path
+** which means to constitute a location
+** and to discover child nodes at that location
+* and we might want to extend (maybe also prune) the collection of children
+
+!!!Use cases
+In the current situation ({{red{10/2017}}}), before engaging into the actual implementation, we're able to identify two distinct use cases
+;View [[specification|GuiComponentView]]
+:locate a view based on a preconfigured placement
+:* either to allocate a new view instance
+:* or to get //just some instance// of a view identified by type
+;WorkSite navication
+:move the Spot to some other place in the UI known by its [[UI-Coordinates|UICoord]]
+
+!!!Requirements clarified
+From these use cases we conclude that the actual requirements for a Navigator component are less than one might expect.
+In fact it is sufficient to keep //the actual element// entirely opaque, so the Navigator works on UI coordinates solely. The result -- some other UI coordinates -- can then be used to accomplish some tasks implemented elsewhere, like allocating a new view or actually moving [[the Spot|Spot]] (&rarr; InteractionControl)
+
 !Challenges of the implementation
 Some tricky problems remain to be solved, though: since the Navigator works on UI coordinates, the fundamental problem remains how to acquire the initial coordinates to start navigation. This is a problem of //reverse lookup:// given a concrete element of the UI, find it's UI coordinates. While we should note that it might not be necessary to "discover" coordinates, because in fact we may know them already -- either the element has to store them (on creation), or some lookup index table could be maintained to serve the same purpose
+
+Moreover, the design of coordinate matching and resolving incurs a structure similar to [[render job planning|FrameDispatcher]] -- and the corresponding design problems remain to be solved in a satisfactory way &rarr; [[some notes...|AboutMonads]]
+
 
@@ -9648,7 +9773,7 @@ The dispatch of //diff messages// is directly integrated into the UI-Bus -- whic The Graphical User interface, the upper layer in this hierarchy, embodies everything of tangible relevance to the user working with the application. The interplay with Proc-Layer, the middle layer below the UI, is organised along the distinction between two realms of equal importance: on one side, there is the immediate //mechanics of the interface,// which is implemented directly within the ~UI-Layer, based on the Graphical User Interface Toolkit. And, on the other side, there are those //core concerns of working with media,// which are cast into the HighLevelModel at the heart of the middle layer.
-
+
//A topological addressing scheme to designate structural locations within the UI.//
 Contrary to conventional screen pixel coordinates, here we aim at a topological description of the UI structure. Such a framework of structural reference allows us                                                                     
 * to refer to some "place" or "space" within the interface                                    
diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm
index e62861921..c03709ba4 100644
--- a/wiki/thinkPad.ichthyo.mm
+++ b/wiki/thinkPad.ichthyo.mm
@@ -69,7 +69,7 @@
 
 
 
-
+
 
   
     
@@ -103,7 +103,7 @@
 
 
 
-
+
 
 
 
@@ -145,7 +145,7 @@
 
 
 
-
+
 
 
 
@@ -154,7 +154,7 @@
 
 
 
-
+
 
 
 
@@ -571,11 +571,11 @@
 
 
 
-
+
 
 
 
-
+
 
 
 
@@ -603,7 +603,7 @@
 
 
 
-
+
 
 
 
@@ -613,7 +613,7 @@
 
 
 
-
+
 
 
 
@@ -654,7 +654,7 @@
 
 
 
-
+
 
 
 
@@ -680,7 +680,7 @@
 
 
 
-
+
 
 
 
@@ -690,7 +690,7 @@
 
 
 
-
+
 
 
 
@@ -738,7 +738,7 @@
 
 
 
-
+
 
   
     
@@ -918,14 +918,14 @@
 
 
 
-
+
 
 
 
 
 
 
-
+
 
 
 
@@ -983,7 +983,7 @@
 
 
 
-
+
 
 
 
@@ -995,7 +995,7 @@
 
 
 
-
+
 
 
 
@@ -1012,7 +1012,7 @@
 
 
 
-
+
 
 
 
@@ -1097,7 +1097,7 @@
 
 
 
-
+
 
 
 
@@ -1137,7 +1137,7 @@
 
 
 
-
+
 
 
 
@@ -1282,7 +1282,7 @@
 
 
 
-
+
 
 
 
@@ -1384,19 +1384,19 @@
 
 
 
-
+
 
 
 
 
 
-
+
 
 
 
 
 
-
+
 
 
 
@@ -1406,7 +1406,7 @@
 
 
 
-
+
 
 
 
@@ -1441,7 +1441,7 @@
     

- + @@ -1461,7 +1461,7 @@ - + @@ -1568,7 +1568,7 @@ - + @@ -1723,7 +1723,7 @@ - + @@ -1778,7 +1778,7 @@ - + @@ -1793,7 +1793,7 @@ - + @@ -1876,10 +1876,10 @@ - + - + @@ -1894,13 +1894,13 @@ - + - + - + @@ -1918,13 +1918,13 @@ - + - + - + @@ -1954,13 +1954,13 @@ - + - + - + @@ -1969,7 +1969,7 @@ - + @@ -1987,9 +1987,9 @@ - + - + @@ -2001,7 +2001,7 @@ - + @@ -2022,7 +2022,7 @@ - + @@ -2031,7 +2031,7 @@ - + @@ -2050,7 +2050,7 @@ - + @@ -2072,9 +2072,9 @@ - + - + @@ -2101,7 +2101,7 @@ - + @@ -2112,7 +2112,7 @@ - + @@ -2133,7 +2133,7 @@ - + @@ -2142,7 +2142,7 @@ - + @@ -2183,7 +2183,7 @@ - + @@ -2193,7 +2193,7 @@ - + @@ -2202,9 +2202,9 @@ - + - + @@ -2262,7 +2262,7 @@ - + @@ -2283,25 +2283,25 @@ - + - + - + - + - + - + @@ -2309,7 +2309,7 @@ - + @@ -2320,11 +2320,11 @@ - + - - + + @@ -2349,7 +2349,7 @@ - + @@ -2382,11 +2382,11 @@ - + - + @@ -2399,29 +2399,29 @@ - + - + - + - + - + - + @@ -2464,22 +2464,22 @@ - + - + - + - + @@ -2501,7 +2501,7 @@ - + @@ -2509,7 +2509,7 @@ - + @@ -2517,7 +2517,7 @@ - + @@ -2563,14 +2563,14 @@ - + - + @@ -2604,7 +2604,7 @@ - + @@ -2636,7 +2636,7 @@ - + @@ -2656,11 +2656,11 @@ - + - + @@ -2784,11 +2784,11 @@ - + - + @@ -2917,8 +2917,8 @@ - - + + @@ -3042,7 +3042,7 @@ - + @@ -3050,14 +3050,14 @@ - + - + @@ -3074,37 +3074,37 @@ - - + + - + - + - + - + - + @@ -3118,7 +3118,7 @@ - + @@ -3131,7 +3131,7 @@ - + @@ -3214,7 +3214,7 @@ - + @@ -3366,7 +3366,7 @@ - + @@ -3374,7 +3374,7 @@ - + @@ -3436,12 +3436,12 @@ - + - + @@ -3450,7 +3450,7 @@ - + @@ -3467,26 +3467,26 @@ - + - + - + - + - + @@ -3496,7 +3496,7 @@ - + @@ -3504,13 +3504,13 @@ - + - + @@ -4078,7 +4078,7 @@ - + @@ -4096,7 +4096,7 @@ - + @@ -4543,19 +4543,19 @@ - + - + - + - + @@ -4574,7 +4574,7 @@ - + @@ -4585,7 +4585,7 @@ - + @@ -4623,22 +4623,22 @@ - + - + - + - + - + @@ -4650,7 +4650,7 @@ - + @@ -4693,24 +4693,24 @@ - + - + - + - - + + - + @@ -4727,19 +4727,20 @@ - + - + - + + @@ -4759,17 +4760,17 @@ - + - + - + @@ -4813,13 +4814,13 @@ - + - - + + @@ -4838,7 +4839,7 @@ - + @@ -4852,10 +4853,10 @@ - + - + @@ -4904,7 +4905,7 @@ - + @@ -4919,17 +4920,17 @@ - + - + - + @@ -4946,23 +4947,23 @@ - + - + - + - + @@ -4977,14 +4978,14 @@ - + - + - + @@ -5001,15 +5002,15 @@ - + - + - + @@ -5019,7 +5020,7 @@ - + @@ -5072,14 +5073,14 @@ - + - + @@ -5087,42 +5088,43 @@ - + - + - + - + - - + - + + + - + - + - + @@ -5152,10 +5154,10 @@ - + - + @@ -5165,14 +5167,14 @@ - + - + @@ -5215,23 +5217,23 @@ - + - + - + - + - + @@ -5252,9 +5254,9 @@ - + - + @@ -5297,7 +5299,7 @@ - + @@ -5328,10 +5330,10 @@ - + - + @@ -5339,35 +5341,35 @@ - + - + - + - + - - + + - + - + - + @@ -5377,14 +5379,14 @@ - + - - + + @@ -5400,10 +5402,10 @@ - + - + @@ -5413,11 +5415,11 @@ - + - + - + @@ -5448,35 +5450,35 @@ - + - + - + - + - + - + - + @@ -5490,7 +5492,7 @@ - + @@ -5517,7 +5519,7 @@

- + @@ -5525,7 +5527,7 @@ - + @@ -5539,9 +5541,9 @@ - + - + @@ -5559,7 +5561,7 @@ - + @@ -5567,18 +5569,18 @@ - + - + - + @@ -5610,7 +5612,7 @@ - + @@ -5633,7 +5635,7 @@ - + @@ -5663,7 +5665,7 @@ - + @@ -5674,7 +5676,7 @@ - + @@ -5683,7 +5685,7 @@ - + @@ -5692,21 +5694,21 @@ - + - + - + - + @@ -5714,7 +5716,7 @@ - + @@ -5725,8 +5727,8 @@ - - + + @@ -5744,7 +5746,7 @@ - + @@ -5761,7 +5763,7 @@ - + @@ -5769,24 +5771,24 @@ - - + + - + - + - + - + @@ -5796,21 +5798,74 @@ + + + + + + + + + + +

+ ...also Programmierung analog zum Filter +

+
    +
  • + sofort aus dem Konstruktor heraus die Invariante etablieren +
  • +
  • + nach jedem Iterations-Schritt die Invariante erneut wiederherstellen +
  • +
+ + +
- - - + + + + + + + + + + + + +

+ der Natur der Dinge folgen, +

+

+ nicht den technischen Möglichkeiten +

+ + +
+ +
+
+
+
+ + + + + - + + - + @@ -5823,14 +5878,14 @@ - + - + - + @@ -5849,7 +5904,7 @@
- + @@ -5880,7 +5935,7 @@
- + @@ -5936,7 +5991,7 @@
- + @@ -5954,7 +6009,7 @@ - + @@ -5972,7 +6027,7 @@
- + @@ -6003,16 +6058,16 @@ - + - + - + @@ -6081,7 +6136,7 @@ - + @@ -6113,22 +6168,22 @@ - + - + - + - + - + @@ -6137,19 +6192,19 @@ - + - + - + @@ -6185,7 +6240,7 @@ - + @@ -6201,16 +6256,16 @@ - + - + - - + + @@ -6218,7 +6273,7 @@ - + @@ -6226,7 +6281,7 @@ - + @@ -6238,11 +6293,11 @@ - + - + - + @@ -6356,7 +6411,7 @@ - + @@ -6365,7 +6420,7 @@ - + @@ -6375,24 +6430,24 @@ - + - + - + - + @@ -6414,12 +6469,12 @@ - + - + @@ -6433,7 +6488,7 @@

- + @@ -6478,14 +6533,14 @@ - + - + - + @@ -6501,10 +6556,10 @@ - + - + @@ -6519,19 +6574,19 @@ - + - + - + @@ -6543,7 +6598,7 @@ - + @@ -6554,14 +6609,14 @@ - + - + @@ -6569,7 +6624,7 @@ - + @@ -6602,7 +6657,7 @@
- + @@ -6634,7 +6689,7 @@ - + @@ -6654,9 +6709,9 @@ - + - + @@ -6665,7 +6720,7 @@ - + @@ -6682,7 +6737,7 @@ - + @@ -6690,7 +6745,7 @@ - + @@ -6716,7 +6771,7 @@ - + @@ -6740,7 +6795,7 @@
- + @@ -6753,7 +6808,7 @@ - + @@ -6794,16 +6849,28 @@ - - + + - - + + + + - - + + + + + + + + + + + + @@ -7008,15 +7075,15 @@ - + - + - + @@ -7049,7 +7116,7 @@ - + @@ -7122,7 +7189,7 @@ - + @@ -7398,17 +7465,17 @@ - + - + - + @@ -7753,7 +7820,7 @@ - + @@ -7851,7 +7918,7 @@ - + @@ -7872,16 +7939,16 @@ - + - + - + @@ -7903,7 +7970,7 @@ - + @@ -7925,7 +7992,7 @@ - + @@ -7946,9 +8013,9 @@ - + - + @@ -7986,12 +8053,12 @@ - + - + @@ -8180,7 +8247,7 @@ - + @@ -8284,7 +8351,7 @@ - + @@ -8320,7 +8387,7 @@ - + @@ -8378,7 +8445,7 @@ - + @@ -8415,7 +8482,7 @@ - + @@ -8438,7 +8505,7 @@ - + @@ -8449,8 +8516,8 @@ - - + + @@ -8468,8 +8535,8 @@ - - + + @@ -8480,14 +8547,14 @@ - + - + @@ -8496,7 +8563,7 @@ - + @@ -8536,7 +8603,7 @@ - + @@ -8544,22 +8611,22 @@ - + - + - - + + - + @@ -8568,12 +8635,12 @@ - - + + - + @@ -8592,7 +8659,7 @@ - + @@ -8618,7 +8685,7 @@ - + @@ -8686,37 +8753,37 @@ - + - + - + - + - + - + - + @@ -8775,7 +8842,7 @@ - + @@ -8883,7 +8950,7 @@ - + @@ -8901,7 +8968,7 @@ - + @@ -8944,7 +9011,7 @@ - + @@ -8961,7 +9028,7 @@ - + @@ -8970,25 +9037,25 @@ - + - + - + - + - + @@ -9007,11 +9074,11 @@ - + - + @@ -9025,7 +9092,7 @@ - + @@ -9040,7 +9107,7 @@ - + @@ -9065,7 +9132,7 @@ - + @@ -9080,14 +9147,14 @@ - + - - + + @@ -9114,7 +9181,7 @@ - + @@ -9127,7 +9194,7 @@ - + @@ -9160,7 +9227,7 @@ - + @@ -9174,7 +9241,7 @@

- + @@ -9202,7 +9269,7 @@ - + @@ -9256,9 +9323,9 @@ - - - + + + @@ -9281,7 +9348,7 @@ - + @@ -9326,7 +9393,7 @@ - + @@ -9367,7 +9434,7 @@ - + @@ -9446,7 +9513,7 @@ - + @@ -9468,13 +9535,13 @@ - + - + @@ -9522,17 +9589,17 @@ - + - + - + @@ -9612,13 +9679,13 @@ - + - + - + @@ -9762,11 +9829,11 @@ - + - + @@ -9782,10 +9849,10 @@ - + - + @@ -9821,12 +9888,12 @@ - - + + - + @@ -9838,7 +9905,7 @@ - + @@ -9896,9 +9963,9 @@ - + - + @@ -9928,12 +9995,12 @@ - + - + @@ -10027,7 +10094,7 @@ - + @@ -10053,7 +10120,7 @@ - + @@ -10069,7 +10136,7 @@ - + @@ -10083,7 +10150,7 @@

- + @@ -10097,20 +10164,20 @@ - + - + - + @@ -10165,7 +10232,7 @@ - + @@ -10212,7 +10279,7 @@ - + @@ -10248,7 +10315,7 @@ - + @@ -10256,20 +10323,20 @@ - + - + - + @@ -10300,7 +10367,7 @@ - + @@ -10318,7 +10385,7 @@
- + @@ -10346,7 +10413,7 @@ - + @@ -10367,7 +10434,7 @@
- + @@ -10389,25 +10456,25 @@ - + - + - + - + @@ -10450,14 +10517,14 @@ - + - + @@ -10468,7 +10535,7 @@ - + @@ -10494,7 +10561,7 @@ - + @@ -10532,12 +10599,12 @@ - + - + @@ -10549,7 +10616,7 @@ - + @@ -10562,7 +10629,7 @@ - + @@ -10589,7 +10656,7 @@

- + @@ -10601,28 +10668,28 @@ - + - + - + - + - + - + - + @@ -10648,7 +10715,7 @@ - + @@ -10662,7 +10729,7 @@ - + @@ -10671,7 +10738,7 @@ - + @@ -10681,7 +10748,7 @@ - + @@ -10689,24 +10756,24 @@ - + - + - + - + - + - + @@ -10714,15 +10781,15 @@ - + - + - + @@ -10737,25 +10804,25 @@ - + - + - + - + - + @@ -10780,7 +10847,7 @@ - + @@ -10793,32 +10860,32 @@ - + - + - + - + - + - - + + @@ -10847,7 +10914,7 @@ - + @@ -10872,7 +10939,7 @@ - + @@ -10881,7 +10948,7 @@ - + @@ -10890,80 +10957,80 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -10979,12 +11046,12 @@ - + - + @@ -11004,9 +11071,9 @@ - + - + @@ -11023,7 +11090,7 @@ - + @@ -11063,13 +11130,13 @@ - + - + @@ -11083,7 +11150,7 @@ - + @@ -11143,10 +11210,10 @@ - + - + @@ -11160,28 +11227,28 @@ - + - + - + - + - + - + - + @@ -11199,7 +11266,7 @@ - + @@ -11223,15 +11290,15 @@ - + - + - + @@ -11247,7 +11314,7 @@ - + @@ -11278,10 +11345,10 @@ - + - + @@ -11291,12 +11358,12 @@ - + - + @@ -11332,13 +11399,13 @@
- + - + - + @@ -11370,7 +11437,7 @@ - + @@ -11391,7 +11458,7 @@ - + @@ -11400,7 +11467,7 @@ - + @@ -11423,60 +11490,60 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -11489,19 +11556,19 @@ - + - - + + - + - + @@ -11527,7 +11594,7 @@ - + @@ -11536,7 +11603,7 @@ - + @@ -11589,7 +11656,7 @@ - + @@ -11621,17 +11688,17 @@ - + - + - + - + @@ -11648,8 +11715,8 @@ - - + + @@ -11741,12 +11808,12 @@ - - + + - + @@ -11758,9 +11825,9 @@ - + - + @@ -11802,7 +11869,7 @@ - + @@ -11810,7 +11877,7 @@ - + @@ -11830,7 +11897,7 @@ - + @@ -11840,21 +11907,21 @@ - + - + - + - + @@ -11877,10 +11944,10 @@ - + - - + + @@ -11943,9 +12010,9 @@ - + - + @@ -11982,7 +12049,7 @@ - + @@ -12016,9 +12083,9 @@ - + - + @@ -12032,7 +12099,7 @@ - + @@ -12056,7 +12123,7 @@ - + @@ -12064,13 +12131,13 @@ - - + + - + @@ -12078,7 +12145,7 @@ - + @@ -12106,19 +12173,19 @@ - - + + - + - + - - + + @@ -12132,7 +12199,7 @@ - + @@ -12159,7 +12226,7 @@ - + @@ -12229,7 +12296,7 @@ - + @@ -12247,10 +12314,10 @@ - + - + @@ -12260,7 +12327,7 @@ - + @@ -12279,7 +12346,7 @@ - + @@ -12297,16 +12364,16 @@ - + - + - + @@ -12315,9 +12382,9 @@ - + - + @@ -12328,7 +12395,7 @@ - + @@ -12351,14 +12418,14 @@

- + - + @@ -12397,10 +12464,10 @@ - + - - + + @@ -12420,34 +12487,34 @@
- + - + - + - - + + - + - + - + @@ -12474,34 +12541,34 @@ - + - + - + - + - + - + - + @@ -12509,11 +12576,11 @@ - + - + @@ -12522,18 +12589,18 @@ - + - + - + - + @@ -12550,7 +12617,7 @@ - + @@ -12595,7 +12662,7 @@ - + @@ -12603,15 +12670,15 @@ - + - + - + @@ -12644,13 +12711,13 @@ - - + + - + @@ -12658,8 +12725,8 @@ - - + + @@ -12674,7 +12741,7 @@ - + @@ -12739,7 +12806,7 @@ - + @@ -12786,14 +12853,14 @@ - - + + - + @@ -12827,9 +12894,9 @@ - + - + @@ -12852,7 +12919,7 @@ - + @@ -12886,8 +12953,8 @@ - - + + @@ -12903,25 +12970,25 @@ - + - + - + - + - + @@ -12948,7 +13015,7 @@
- + @@ -12971,7 +13038,7 @@ - + @@ -13026,7 +13093,7 @@ - + @@ -13045,8 +13112,8 @@ - - + + @@ -13060,7 +13127,7 @@

- + @@ -13079,8 +13146,8 @@ - - + + @@ -13113,18 +13180,18 @@ - - + + - + - + @@ -13184,7 +13251,7 @@ - + @@ -13200,7 +13267,7 @@ - + @@ -13213,11 +13280,11 @@ - + - + @@ -13231,7 +13298,7 @@

- + @@ -13255,7 +13322,7 @@ - + @@ -13266,11 +13333,11 @@ - + - + @@ -13278,14 +13345,14 @@ - + - + @@ -13296,7 +13363,7 @@ - + @@ -13331,19 +13398,19 @@ - + - + - + @@ -13360,7 +13427,7 @@ - + @@ -13377,7 +13444,7 @@ - + @@ -13386,7 +13453,7 @@ - + @@ -13400,25 +13467,25 @@

- + - + - + - + - + - + @@ -13426,18 +13493,18 @@ - + - + - + @@ -13458,21 +13525,21 @@ - + - + - + @@ -13507,28 +13574,28 @@ - - + + - + - + - - - - + + + + - + @@ -13577,22 +13644,22 @@ - + - + - + - + @@ -13603,11 +13670,11 @@ - + - + - + @@ -13639,7 +13706,7 @@ - + @@ -13648,7 +13715,7 @@ - + @@ -13676,7 +13743,7 @@ - + @@ -13691,14 +13758,14 @@ - + - + @@ -13718,7 +13785,7 @@ - + @@ -13730,7 +13797,7 @@ - + @@ -13777,7 +13844,7 @@ - + @@ -13798,7 +13865,7 @@ - + @@ -13816,13 +13883,13 @@ - - + + - + @@ -13875,7 +13942,7 @@ - + @@ -13920,9 +13987,9 @@ - + - + @@ -13944,14 +14011,14 @@ - + - + @@ -13960,7 +14027,7 @@ - + @@ -13970,7 +14037,7 @@ - + @@ -13979,15 +14046,15 @@ - - + + - + @@ -14011,9 +14078,9 @@ - + - + @@ -14036,9 +14103,9 @@ - + - + @@ -14046,7 +14113,7 @@ - + @@ -14054,7 +14121,7 @@ - + @@ -14068,7 +14135,7 @@ - + @@ -14099,8 +14166,8 @@ - - + + @@ -14112,7 +14179,7 @@ - + @@ -14123,18 +14190,18 @@ - + - + - + - + @@ -14160,7 +14227,7 @@ - + @@ -14263,38 +14330,38 @@ - + - - + + - + - + - - - + + + - + - + - + - - + + @@ -14312,13 +14379,13 @@ - + - + @@ -14336,14 +14403,14 @@ - + - + - + @@ -14351,9 +14418,9 @@ - + - + @@ -14387,25 +14454,25 @@ - + - + - + - + - + @@ -14432,7 +14499,7 @@ - + @@ -14440,7 +14507,7 @@ - + @@ -14485,7 +14552,7 @@ - + @@ -14502,14 +14569,14 @@ - + - + - + @@ -14522,14 +14589,14 @@ - + - + @@ -14543,10 +14610,10 @@ - + - + @@ -14603,9 +14670,9 @@ - + - + @@ -14616,7 +14683,7 @@

- + @@ -14645,7 +14712,7 @@ - + @@ -14672,14 +14739,14 @@ - + - + - + @@ -14687,9 +14754,9 @@ - + - + @@ -14701,18 +14768,18 @@ - + - + - + - + @@ -14749,7 +14816,7 @@ - + @@ -14771,9 +14838,9 @@ - + - + @@ -14796,7 +14863,7 @@ - + @@ -14814,13 +14881,13 @@ - + - + @@ -14867,7 +14934,7 @@ - + @@ -14914,7 +14981,7 @@ - + @@ -14926,24 +14993,24 @@ - + - + - + - + - + @@ -14984,7 +15051,7 @@ - + @@ -15007,9 +15074,9 @@ - + - + @@ -15024,7 +15091,7 @@ - + @@ -15061,12 +15128,12 @@ - + - + @@ -15088,16 +15155,16 @@ - + - + - + @@ -15111,14 +15178,14 @@ - + - + - + @@ -15135,7 +15202,7 @@ - + @@ -15179,11 +15246,11 @@ - + - + @@ -15216,10 +15283,10 @@ - + - + @@ -15274,22 +15341,22 @@ - + - + - + - + @@ -15323,7 +15390,7 @@ - + @@ -15350,21 +15417,21 @@ - + - + - + - + @@ -15377,10 +15444,10 @@ - + - - + + @@ -15390,7 +15457,7 @@ - + @@ -15448,7 +15515,7 @@ - + @@ -15468,9 +15535,9 @@ - - - + + + @@ -15480,7 +15547,7 @@ - + @@ -15504,20 +15571,20 @@ - + - + - + - + @@ -15537,7 +15604,7 @@ - + @@ -15558,7 +15625,7 @@ - + @@ -15574,7 +15641,7 @@ - + @@ -15608,7 +15675,7 @@ - + @@ -15668,7 +15735,7 @@ - + @@ -15713,10 +15780,10 @@ - + - + @@ -15738,11 +15805,11 @@ - - + + - + @@ -15776,16 +15843,16 @@ - + - + - + - + @@ -15803,7 +15870,7 @@ - + @@ -15841,7 +15908,7 @@ - + @@ -15884,7 +15951,7 @@ - + @@ -15928,12 +15995,12 @@ - + - + - + @@ -15952,7 +16019,7 @@ - + @@ -15993,15 +16060,15 @@ - + - + - + @@ -16009,7 +16076,7 @@ - + @@ -16027,22 +16094,22 @@ - + - + - + - + @@ -16062,7 +16129,7 @@ - + @@ -16121,7 +16188,7 @@ - + @@ -16197,27 +16264,27 @@ - + - + - + - + - + @@ -16231,12 +16298,12 @@ - + - + @@ -16272,12 +16339,12 @@ - + - + @@ -16310,15 +16377,15 @@ - + - + - + @@ -16329,7 +16396,7 @@ - + @@ -16338,15 +16405,15 @@ - + - - + + @@ -16355,32 +16422,32 @@ - - + + - + - + - + - - + + - + - + @@ -16388,7 +16455,7 @@ - + @@ -16399,7 +16466,7 @@ - + @@ -16499,11 +16566,11 @@ - + - + @@ -16536,7 +16603,7 @@ - + @@ -16558,7 +16625,7 @@ - + @@ -16577,7 +16644,7 @@ - + @@ -16637,7 +16704,7 @@ - + @@ -16664,7 +16731,7 @@ - + @@ -16678,7 +16745,7 @@ - + @@ -16730,7 +16797,7 @@
- + @@ -16742,9 +16809,9 @@ - + - + @@ -16755,7 +16822,7 @@ - + @@ -16789,8 +16856,8 @@ - - + + @@ -16952,7 +17019,7 @@ - + @@ -17068,7 +17135,7 @@ - + @@ -17155,7 +17222,7 @@ - + @@ -17233,7 +17300,7 @@ - + @@ -17258,7 +17325,7 @@ - + @@ -17554,7 +17621,7 @@ - + @@ -17592,7 +17659,7 @@ - + @@ -17602,7 +17669,7 @@ - + @@ -17675,7 +17742,7 @@ - + @@ -17739,7 +17806,7 @@ - + @@ -17907,7 +17974,7 @@ - + @@ -18110,7 +18177,7 @@ - + @@ -18321,7 +18388,7 @@ - + @@ -18381,7 +18448,7 @@ - + @@ -18422,7 +18489,7 @@ - + @@ -18440,7 +18507,7 @@ - + @@ -18590,7 +18657,7 @@ - + @@ -18832,7 +18899,7 @@ - + @@ -19012,7 +19079,7 @@ - + @@ -19025,7 +19092,7 @@ - + @@ -19134,7 +19201,7 @@ - + @@ -19202,7 +19269,7 @@ - + @@ -19248,7 +19315,7 @@ - + @@ -19281,7 +19348,7 @@ - + @@ -19297,17 +19364,17 @@ - + - + - - + + - + @@ -19315,7 +19382,7 @@ - + @@ -19326,12 +19393,12 @@ - - + + - + @@ -19381,11 +19448,11 @@ - + - + - + @@ -19401,7 +19468,7 @@ - + @@ -19456,7 +19523,7 @@ - + @@ -19480,7 +19547,7 @@ - + @@ -19499,11 +19566,11 @@ - + - + @@ -19523,7 +19590,7 @@ - + @@ -19557,21 +19624,21 @@ - + - + - + - + @@ -19637,7 +19704,7 @@ - + @@ -19659,12 +19726,12 @@ - + - + @@ -19711,7 +19778,7 @@ - + @@ -19733,7 +19800,7 @@ - + @@ -19778,7 +19845,7 @@ - + @@ -19811,9 +19878,9 @@ - + - + @@ -19834,7 +19901,7 @@ - + @@ -19845,7 +19912,7 @@

- + @@ -19879,7 +19946,7 @@ - + @@ -19943,13 +20010,13 @@
- + - + - + @@ -20011,16 +20078,16 @@ - + - + - + @@ -20060,7 +20127,7 @@ - + @@ -20071,7 +20138,7 @@ - + @@ -20090,14 +20157,14 @@ - + - + - + @@ -20113,7 +20180,7 @@
- + @@ -20130,7 +20197,7 @@ - + @@ -20142,15 +20209,15 @@ - - + + - + - + @@ -20164,7 +20231,7 @@ - + @@ -20185,7 +20252,7 @@ - + @@ -20220,7 +20287,7 @@ - + @@ -20246,7 +20313,7 @@ - + @@ -20263,7 +20330,7 @@ - + @@ -20314,7 +20381,7 @@ - + @@ -20367,8 +20434,8 @@ - - + + @@ -20384,7 +20451,7 @@ - + @@ -20396,7 +20463,7 @@ - + @@ -20410,7 +20477,7 @@

- + @@ -20418,9 +20485,9 @@ - + - + @@ -20436,7 +20503,7 @@
- + @@ -20458,22 +20525,22 @@ - + - + - + - + - + @@ -20493,13 +20560,13 @@ - + - + - + @@ -20511,25 +20578,25 @@ - - + + - + - + - + - - + + @@ -20545,27 +20612,27 @@ - + - + - + - - + + - + @@ -20573,7 +20640,7 @@ - + @@ -20595,8 +20662,8 @@ - - + + @@ -20651,7 +20718,7 @@ - + @@ -20685,11 +20752,11 @@ - - + + - + @@ -20739,15 +20806,15 @@ - + - + - + @@ -20776,9 +20843,9 @@ - - - + + + @@ -20786,7 +20853,7 @@ - + @@ -20794,18 +20861,18 @@ - + - - + + - + @@ -20820,7 +20887,7 @@ - + @@ -20849,7 +20916,7 @@ - + @@ -20857,7 +20924,7 @@ - + @@ -20914,7 +20981,7 @@ - + @@ -20922,7 +20989,7 @@ - + @@ -20936,7 +21003,7 @@ - + @@ -20951,12 +21018,12 @@ - + - + @@ -20974,7 +21041,7 @@ - + @@ -21031,9 +21098,9 @@ - + - + @@ -21046,15 +21113,15 @@ - + - + - + @@ -21070,20 +21137,20 @@ - + - + - + - + - + @@ -21099,12 +21166,12 @@
- + - + @@ -21129,7 +21196,7 @@ - + @@ -21166,7 +21233,7 @@ - + @@ -21182,7 +21249,7 @@ - + @@ -21202,7 +21269,7 @@ - + @@ -21216,7 +21283,7 @@ - + @@ -21232,9 +21299,9 @@ - + - + @@ -21257,19 +21324,19 @@ - + - + - + @@ -21292,11 +21359,11 @@ - + - + @@ -21340,7 +21407,7 @@ - + @@ -21357,7 +21424,7 @@ - + @@ -21377,7 +21444,7 @@ - + @@ -21388,7 +21455,7 @@ - + @@ -21479,13 +21546,13 @@ - + - + @@ -21508,7 +21575,7 @@ - + @@ -21516,21 +21583,21 @@ - + - - + + - + - + @@ -21544,48 +21611,48 @@ - - + + - + - - + + - + - + - + - - + + - + @@ -21593,7 +21660,7 @@ - + @@ -21627,12 +21694,12 @@ - + - + @@ -21663,7 +21730,7 @@ - + @@ -21707,7 +21774,7 @@ - + @@ -21751,7 +21818,7 @@ - + @@ -21771,7 +21838,7 @@ - + @@ -21784,7 +21851,7 @@ - + @@ -22095,7 +22162,7 @@ - + @@ -22106,7 +22173,7 @@ - + @@ -22115,7 +22182,7 @@ - + @@ -22245,7 +22312,7 @@ - + @@ -22292,6 +22359,190 @@ + + + + + + + + + + + + + + + + + + +

+ Thema: Monaden +

+ + +
+ + + + + + + + + + + + + + + + +

+ gehört zu dem Themenkomplex "itertools" +

+

+ Python hat das auch, Java neuerdings auch +

+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ ...will sagen, es ist klar, wie man sowas machen kann. +

+

+ Seinerzeit war mir das auch klar, aber ich wollte es nicht gleich ausprogrammieren. +

+

+ Inzwischen kam dann das Thema UI-Coordinaten, und dort habe ich es ausprogrammiert, +

+

+ und zwar direkt in die Low-Level-Schicht integriert, was nicht schlecht ist, +

+

+ da eine Abstraktion hier sehr technisch werden würde +

+ + +
+
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + +

+ ...bindet die Betrachtung auf einen technischen Level, +

+

+ und führt dazu, daß die Abstraktion undicht wird +

+ + +
+
+ + + + + + + + + + + + +

+ genau der Umstand, +

+

+ daß funktionale Sprachen von einer Zustands-Phobie getrieben sind, +

+

+ macht Monaden nützlich, um inhärenten Zustand wegzuabstrahieren. +

+

+ Das kann genutzt werden, um den Zustand einer Wechselwirkung +

+

+ nach einer Seite der Glieder auszukoppeln. +

+ + +
+
+ + + + + + + + + + + + + +
+
+
+
+ + + + @@ -22610,16 +22861,16 @@ - - + + - - + + @@ -22649,19 +22900,19 @@ - - + + - + - + @@ -22671,7 +22922,7 @@ - + @@ -22694,7 +22945,7 @@
- + @@ -22710,7 +22961,7 @@ - + @@ -22725,7 +22976,7 @@ - + @@ -22743,7 +22994,7 @@
- + @@ -22765,17 +23016,17 @@ - + - + - + @@ -22784,10 +23035,10 @@ - + - + @@ -22830,7 +23081,7 @@ - + @@ -22843,7 +23094,7 @@ - + @@ -22871,11 +23122,11 @@ - + - + @@ -22944,7 +23195,7 @@ - + @@ -23064,7 +23315,7 @@

- + @@ -23364,8 +23615,8 @@ - - + + @@ -23380,7 +23631,7 @@ - + @@ -23537,7 +23788,7 @@ - + @@ -23553,8 +23804,8 @@ - - + + @@ -23567,7 +23818,7 @@ - + @@ -23638,7 +23889,7 @@ - +