clean-up: simplify function-closure -- investigate BindToArgument

...because swapping in the new standards-based implementation
leads to compile failures on tests to cover out-of-bounds cases.

Under the (wrong) assumption, that some mistake must be hidden in
the Splice-metafunction, I first provided a complete test coverage;
while the actual problem was right below my nose, and quite obvious...

The old implementation, being based on a case distinction over the argument count,
simply was not able even to notice excess arguments; other the new implementation,
based on variadics and `std::apply`, which is fully generic and thus
passes excess arguments to `std::bind` when a position beyond the actual
argument list is specified to be closed.

The old behaviour was to silently ignore such an out-of-bounds spec,
and this can be reinstated by explicitly capping the prepared tuple
of binders and actual arguments passed to `std::bind`

Another question of course is, if being tolerant here is a good idea.


And beyond that, function-closure.hpp is still terrifyingly complex,
unorganised and use-case driven, to start with....
This commit is contained in:
Fischlurch 2025-06-05 18:00:05 +02:00
parent 415e4746a6
commit 738d9e5b67
5 changed files with 492 additions and 78 deletions

View file

@ -583,7 +583,7 @@ namespace func{
/**
* Bind a specific argument to an arbitrary value.
* Especially, this "value" might be another binder.
* Notably this "value" might be another binder.
*/
template<typename SIG, typename X, uint pos>
class BindToArgument
@ -600,10 +600,11 @@ namespace func{
using PlaceholdersBefore = typename func::PlaceholderTuple<RemainingFront>::List;
using PlaceholdersBehind = typename func::PlaceholderTuple<RemainingBack,pos+1>::List;
using PreparedArgs = typename Append< typename Append< PlaceholdersBefore
, ValList >::List
, PlaceholdersBehind
using PreparedArgsRaw = typename Append<typename Append<PlaceholdersBefore // arguments before the splice: passed-through
,ValList >::List // splice in the value tuple
,PlaceholdersBehind // arguments behind the splice: passed-through
>::List;
using PreparedArgs = Prefix<PreparedArgsRaw, ARG_CNT>;
using ReducedArgs = typename Append<RemainingFront, RemainingBack>::List;
using PreparedArgTypes = typename TySeq<PreparedArgs>::Seq;
@ -625,8 +626,7 @@ namespace func{
reduced (SIG& f, X val)
{
Tuple<PreparedArgTypes> params {BuildPreparedArgs{std::make_tuple (val)}};
return func::Apply<ARG_CNT>::template bind<ReducedFunc> (f, params);
// return bindArgTuple (f, params); ///////////////////////////////////////////////////////OOO does not compile when pos > length of ArgList
return bindArgTuple (f, params);
}
};

View file

@ -201,6 +201,14 @@ namespace meta {
using Front = Nil;
using Back = Nil; };
/** extract prefix of given length */
template<class LI, uint l>
using Prefix = typename Splice<LI, Nil, l>::Front;
/** extract suffix starting at given pos */
template<class LI, uint p>
using Suffix = typename Splice<LI, Nil, p>::Back;

View file

@ -30,7 +30,7 @@ namespace meta {
namespace test {
using ::test::Test;
using lib::test::showType;
// using lib::test::showType;
using lib::meta::_Fun;
using func::applyFirst;
using func::applyLast;
@ -192,9 +192,8 @@ namespace test {
, ph2
);
int res = 0;
res = fun_23 (_2_,_3_).o_; // and invoke the resulting functor ("closure"), providing the remaining arguments
CHECK (23 == res);
int r1 = fun_23 (_2_,_3_).o_; // and invoke the resulting functor ("closure"), providing the remaining arguments
CHECK (23 == r1); // result ≡ num18 + _2_ + _3_ ≙ 18 + 2 + 3
@ -207,10 +206,15 @@ namespace test {
, get<1>(arg)
, get<2>(arg)
);
res = 0;
res = fun_23 (_2_,_3_).o_; // and invoke the resulting functor....
CHECK (23 == res);
int r2 = fun_23 (_2_,_3_).o_; // and invoke the resulting functor....
CHECK (23 == r2);
// function-closure.hpp defines a shorthand for this operation
fun_23 = func::bindArgTuple (f, arg);
int r3 = fun_23 (_2_,_3_).o_;
CHECK (23 == r3);
@ -221,9 +225,9 @@ namespace test {
fun_23 = PApply<Sig123, ArgTypes>::bindFront (f , args_to_bind);
// "bindFront" will close the parameters starting from left....
res = 0;
res = fun_23 (_2_,_3_).o_; // invoke the resulting functor...
CHECK (23 == res);
int r4 = fun_23 (_2_,_3_).o_; // invoke the resulting functor...
CHECK (23 == r4);
@ -232,33 +236,33 @@ namespace test {
// Version4: as you'd typically do it in real life-------- //
/*
fun_23 = func::applyFirst (f, Num<1>(18)); // use the convenience function API to close over a single value
res = 0;
res = fun_23(_2_,_3_).o_; // invoke the resulting functor...
CHECK (23 == res);
int r5 = fun_23(_2_,_3_).o_; // invoke the resulting functor...
CHECK (23 == r5);
// what follows is the real unit test...
function<Sig123> func123{f}; // alternatively do it with an std::function object
fun_23 = func::applyFirst (func123, Num<1>(19));
res = fun_23(_2_,_3_).o_;
CHECK (24 == res);
int r5 = fun_23(_2_,_3_).o_;
CHECK (24 == r5);
using F12 = function<Num<1>(Num<1>, Num<2>)>;
F12 fun_12 = func::applyLast (f, Num<3>(20)); // close the *last* argument of a function
res = fun_12(_1_,_2_).o_;
CHECK (23 == res);
int r6 = fun_12(_1_,_2_).o_;
CHECK (23 == r6);
fun_12 = func::applyLast (func123, Num<3>(21)); // alternatively use a function object
res = fun_12(_1_,_2_).o_;
CHECK (24 == res);
int r7 = fun_12(_1_,_2_).o_;
CHECK (24 == r7);
Sig123* fP = &f; // a function pointer works too
fun_12 = func::applyLast (fP, Num<3>(22));
res = fun_12(_1_,_2_).o_;
CHECK (25 == res);
int r8 = fun_12(_1_,_2_).o_;
CHECK (25 == r8);
// cover more cases....
CHECK (1 == (func::applyLast (fun11<1> , _1_ ) ( ) ).o_);
@ -272,6 +276,7 @@ namespace test {
CHECK ( 7+6+5 == (func::applyFirst( fun13<7,6,5>, _7_ ) (_6_,_5_)).o_);
CHECK ( 6+5 == (func::applyFirst( fun12<6,5>, _6_ ) (_5_)).o_);
CHECK ( 5 == (func::applyFirst( fun11<5>, _5_ ) ( )).o_);
*/
@ -279,7 +284,7 @@ namespace test {
// covering the general case of partial function closure:
typedef Num<5> Sig54321 (Num<5>, Num<4>, Num<3>, Num<2>, Num<1>); // Signature of the 5-argument function
typedef Num<5> Sig54 (Num<5>, Num<4>); // ...closing the last 3 arguments should yield this 2-argument function
using Args2Close = TyOLD<Num<3>, Num<2>, Num<1>>; // Tuple type to hold the 3 argument values used for the closure
using Args2Close = TySeq<Num<3>, Num<2>, Num<1>>; // Tuple type to hold the 3 argument values used for the closure
// Close the trailing 3 arguments of the 5-argument function...
function<Sig54> fun_54 = PApply<Sig54321,Args2Close>::bindBack (fun15<5,4,3,2,1>
@ -293,7 +298,6 @@ namespace test {
void
check_functionalComposition ()
{
@ -399,9 +403,9 @@ namespace test {
using SigC = _Fun<decltype(chain)>::Sig;
using SigP = _Fun<decltype(pappl)>::Sig;
CHECK (showType<Sig1>() == "double (float&, int&, long)"_expect);
CHECK (showType<SigC>() == "long (float&, int&, long)"_expect);
CHECK (showType<SigP>() == "double (int&, long)"_expect);
// CHECK (showType<Sig1>() == "double (float&, int&, long)"_expect);
// CHECK (showType<SigC>() == "long (float&, int&, long)"_expect);
// CHECK (showType<SigP>() == "double (int&, long)"_expect);
CHECK (220 == f1 (ff,ii,33));
CHECK (220 == chain(ff,ii,33));

View file

@ -45,14 +45,14 @@ namespace test {
namespace { // type-lists to test with
typedef TySeq< Num<1>
using List1 = TySeq< Num<1>
, Num<2>
, Num<3>
>::List List1;
typedef TySeq< Num<5>
>::List;
using List2 = TySeq< Num<5>
, Num<6>
, Num<7>
>::List List2;
>::List;
// see also the CountDown template in typelist-diagnostics.hpp...
@ -193,42 +193,266 @@ namespace test {
}
/** @test splice (or rather paste) a list on top of a base list
/** @test splice (or rather paste) a list on top of a base list.
* @note a zero-splice can be used to extract arbitrary sublists
* @remark the intended use case is to manipulate some parameters
* in a given function-type argument list
* @remark this test is so extensive (really complete coverage),
* since in 2025 a malfunction was mistakenly suspected.
*/
void
verify_splice ()
{
using OLi = TySeq<Num<9>,Num<8>>::List;
// will "paste" the list OLi "on top" of another Typelist...
{ // various base lists
using BaLi1 = TySeq<Num<1>>::List; EXPECT (BaLi1, "-<1>-");
using BaLi2 = TySeq<Num<1>,Num<2>>::List; EXPECT (BaLi2, "-<1>-<2>-");
using BaLi3 = TySeq<Num<1>,Num<2>,Num<3>>::List; EXPECT (BaLi3, "-<1>-<2>-<3>-");
using BaLi5 = TySeq<Num<1>,Num<2>,Num<3>,Num<4>,Num<5>>::List;
EXPECT (BaLi5, "-<1>-<2>-<3>-<4>-<5>-");
using Overl01 = Splice<Nil, Nil>; EXPECT (Overl01, "-");
using Overl02 = Splice<Nil, OLi>; EXPECT (Overl02, "-");
using Overl03 = Splice<Nil, OLi, 5>; EXPECT (Overl03, "-");
using Overl04 = Splice<List1, OLi>; EXPECT (Overl04, "-<9>-<8>-<3>-");
using Overl05 = Splice<List1, OLi, 1>; EXPECT (Overl05, "-<1>-<9>-<8>-");
using Overl06 = Splice<List1, OLi, 2>; EXPECT (Overl06, "-<1>-<2>-<9>-");
using Overl07 = Splice<List1, OLi, 3>; EXPECT (Overl07, "-<1>-<2>-<3>-");
using Overl08 = Splice<List1, OLi, 5>; EXPECT (Overl08, "-<1>-<2>-<3>-");
using Overl09 = Splice<List1, List1>; EXPECT (Overl09, "-<1>-<2>-<3>-");
using Overl10 = Splice<List1, List1, 1>; EXPECT (Overl10, "-<1>-<1>-<2>-");
using Overl11 = Splice<List1, Nil>; EXPECT (Overl11, "-<1>-<2>-<3>-");
using Overl12 = Splice<List1, Nil, 1>; EXPECT (Overl12, "-<1>-<2>-<3>-");
using Overl13 = Splice<List1, Nil, 5>; EXPECT (Overl13, "-<1>-<2>-<3>-");
// will "paste" those overlay lists "on top" the base typelists...
using OLi1 = TySeq<Num<9>>::List; EXPECT (OLi1, "-<9>-");
using OLi2 = TySeq<Num<9>,Num<8>>::List; EXPECT (OLi2, "-<9>-<8>-");
using OLi3 = TySeq<Num<9>,Num<8>,Num<7>>::List; EXPECT (OLi3, "-<9>-<8>-<7>-");
using OLi2 = TySeq<Num<99>>::List;
// can retrieve the remaining part of the original list, left and right of splice
using Front1 = Splice<List1, OLi2, 0>::Front; EXPECT (Front1, "-" );
using Front2 = Splice<List1, OLi2, 1>::Front; EXPECT (Front2, "-<1>-" );
using Front3 = Splice<List1, OLi2, 5>::Front; EXPECT (Front3, "-<1>-<2>-<3>-");
using Back1 = Splice<List1, OLi2, 0>::Back; EXPECT (Back1 , "-<2>-<3>-" );
using Back2 = Splice<List1, OLi2, 1>::Back; EXPECT (Back2 , "-<3>-" );
using Back3 = Splice<List1, OLi2, 5>::Back; EXPECT (Back3 , "-" );
// Note: with a Null-Overlay, this can be used to extract arbitrary sublists:
using Front4 = Splice<List1, Nil, 1>::Front; EXPECT (Front4, "-<1>-" );
using Back4 = Splice<List1, Nil, 1>::Back; EXPECT (Back4 , "-<2>-<3>-");
///////////////////////////////////////////////////
// (1) simple cases : on top of 3-element base list
using Spli01 = Splice<BaLi3, OLi1>; EXPECT (Spli01, "-<9>-<2>-<3>-");
using Spli02 = Splice<BaLi3, OLi1, 1>; EXPECT (Spli02, "-<1>-<9>-<3>-");
using Spli03 = Splice<BaLi3, OLi1, 2>; EXPECT (Spli03, "-<1>-<2>-<9>-");
using Spli04 = Splice<BaLi3, OLi1, 3>; EXPECT (Spli04, "-<1>-<2>-<3>-");
using Spli05 = Splice<BaLi3, OLi1, 5>; EXPECT (Spli05, "-<1>-<2>-<3>-");
using Spli06 = Splice<BaLi3, OLi2, 0>; EXPECT (Spli06, "-<9>-<8>-<3>-");
using Spli07 = Splice<BaLi3, OLi2, 1>; EXPECT (Spli07, "-<1>-<9>-<8>-");
using Spli08 = Splice<BaLi3, OLi2, 2>; EXPECT (Spli08, "-<1>-<2>-<9>-");
using Spli09 = Splice<BaLi3, OLi2, 3>; EXPECT (Spli09, "-<1>-<2>-<3>-");
using Spli10 = Splice<BaLi3, OLi2, 5>; EXPECT (Spli10, "-<1>-<2>-<3>-");
using Spli11 = Splice<BaLi3, OLi3, 0>; EXPECT (Spli11, "-<9>-<8>-<7>-");
using Spli12 = Splice<BaLi3, OLi3, 1>; EXPECT (Spli12, "-<1>-<9>-<8>-");
using Spli13 = Splice<BaLi3, OLi3, 2>; EXPECT (Spli13, "-<1>-<2>-<9>-");
using Spli14 = Splice<BaLi3, OLi3, 3>; EXPECT (Spli14, "-<1>-<2>-<3>-");
using Spli15 = Splice<BaLi3, OLi3, 5>; EXPECT (Spli15, "-<1>-<2>-<3>-");
// (1b) corresponding Front / Back cases
using Frnt01 = Splice<BaLi3, OLi1> ::Front; EXPECT (Frnt01, "-");
using Frnt02 = Splice<BaLi3, OLi1, 1>::Front; EXPECT (Frnt02, "-<1>-");
using Frnt03 = Splice<BaLi3, OLi1, 2>::Front; EXPECT (Frnt03, "-<1>-<2>-");
using Frnt04 = Splice<BaLi3, OLi1, 3>::Front; EXPECT (Frnt04, "-<1>-<2>-<3>-");
using Frnt05 = Splice<BaLi3, OLi1, 5>::Front; EXPECT (Frnt05, "-<1>-<2>-<3>-");
using Frnt06 = Splice<BaLi3, OLi2, 0>::Front; EXPECT (Frnt06, "-");
using Frnt07 = Splice<BaLi3, OLi2, 1>::Front; EXPECT (Frnt07, "-<1>-");
using Frnt08 = Splice<BaLi3, OLi2, 2>::Front; EXPECT (Frnt08, "-<1>-<2>-");
using Frnt09 = Splice<BaLi3, OLi2, 3>::Front; EXPECT (Frnt09, "-<1>-<2>-<3>-");
using Frnt10 = Splice<BaLi3, OLi2, 5>::Front; EXPECT (Frnt10, "-<1>-<2>-<3>-");
using Frnt11 = Splice<BaLi3, OLi3, 0>::Front; EXPECT (Frnt11, "-");
using Frnt12 = Splice<BaLi3, OLi3, 1>::Front; EXPECT (Frnt12, "-<1>-");
using Frnt13 = Splice<BaLi3, OLi3, 2>::Front; EXPECT (Frnt13, "-<1>-<2>-");
using Frnt14 = Splice<BaLi3, OLi3, 3>::Front; EXPECT (Frnt14, "-<1>-<2>-<3>-");
using Frnt15 = Splice<BaLi3, OLi3, 5>::Front; EXPECT (Frnt15, "-<1>-<2>-<3>-");
using Back01 = Splice<BaLi3, OLi1> ::Back; EXPECT (Back01, "-<2>-<3>-");
using Back02 = Splice<BaLi3, OLi1, 1>::Back; EXPECT (Back02, "-<3>-");
using Back03 = Splice<BaLi3, OLi1, 2>::Back; EXPECT (Back03, "-");
using Back04 = Splice<BaLi3, OLi1, 3>::Back; EXPECT (Back04, "-");
using Back05 = Splice<BaLi3, OLi1, 5>::Back; EXPECT (Back05, "-");
using Back06 = Splice<BaLi3, OLi2, 0>::Back; EXPECT (Back06, "-<3>-");
using Back07 = Splice<BaLi3, OLi2, 1>::Back; EXPECT (Back07, "-");
using Back08 = Splice<BaLi3, OLi2, 2>::Back; EXPECT (Back08, "-");
using Back09 = Splice<BaLi3, OLi2, 3>::Back; EXPECT (Back09, "-");
using Back10 = Splice<BaLi3, OLi2, 5>::Back; EXPECT (Back10, "-");
using Back11 = Splice<BaLi3, OLi3, 0>::Back; EXPECT (Back11, "-");
using Back12 = Splice<BaLi3, OLi3, 1>::Back; EXPECT (Back12, "-");
using Back13 = Splice<BaLi3, OLi3, 2>::Back; EXPECT (Back13, "-");
using Back14 = Splice<BaLi3, OLi3, 3>::Back; EXPECT (Back14, "-");
using Back15 = Splice<BaLi3, OLi3, 5>::Back; EXPECT (Back15, "-");
///////////////////////////////////////////////////
// (2) simple cases : on top of 5-element base list
using Spli16 = Splice<BaLi5, OLi1>; EXPECT (Spli16, "-<9>-<2>-<3>-<4>-<5>-");
using Spli17 = Splice<BaLi5, OLi1, 1>; EXPECT (Spli17, "-<1>-<9>-<3>-<4>-<5>-");
using Spli18 = Splice<BaLi5, OLi1, 2>; EXPECT (Spli18, "-<1>-<2>-<9>-<4>-<5>-");
using Spli19 = Splice<BaLi5, OLi1, 3>; EXPECT (Spli19, "-<1>-<2>-<3>-<9>-<5>-");
using Spli20 = Splice<BaLi5, OLi1, 4>; EXPECT (Spli20, "-<1>-<2>-<3>-<4>-<9>-");
using Spli21 = Splice<BaLi5, OLi1, 5>; EXPECT (Spli21, "-<1>-<2>-<3>-<4>-<5>-");
using Spli22 = Splice<BaLi5, OLi1, 8>; EXPECT (Spli22, "-<1>-<2>-<3>-<4>-<5>-");
using Spli23 = Splice<BaLi5, OLi2, 0>; EXPECT (Spli23, "-<9>-<8>-<3>-<4>-<5>-");
using Spli24 = Splice<BaLi5, OLi2, 1>; EXPECT (Spli24, "-<1>-<9>-<8>-<4>-<5>-");
using Spli25 = Splice<BaLi5, OLi2, 2>; EXPECT (Spli25, "-<1>-<2>-<9>-<8>-<5>-");
using Spli26 = Splice<BaLi5, OLi2, 3>; EXPECT (Spli26, "-<1>-<2>-<3>-<9>-<8>-");
using Spli27 = Splice<BaLi5, OLi2, 4>; EXPECT (Spli27, "-<1>-<2>-<3>-<4>-<9>-");
using Spli28 = Splice<BaLi5, OLi2, 5>; EXPECT (Spli28, "-<1>-<2>-<3>-<4>-<5>-");
using Spli29 = Splice<BaLi5, OLi2, 8>; EXPECT (Spli29, "-<1>-<2>-<3>-<4>-<5>-");
using Spli30 = Splice<BaLi5, OLi3, 0>; EXPECT (Spli30, "-<9>-<8>-<7>-<4>-<5>-");
using Spli31 = Splice<BaLi5, OLi3, 1>; EXPECT (Spli31, "-<1>-<9>-<8>-<7>-<5>-");
using Spli32 = Splice<BaLi5, OLi3, 2>; EXPECT (Spli32, "-<1>-<2>-<9>-<8>-<7>-");
using Spli33 = Splice<BaLi5, OLi3, 3>; EXPECT (Spli33, "-<1>-<2>-<3>-<9>-<8>-");
using Spli34 = Splice<BaLi5, OLi3, 4>; EXPECT (Spli34, "-<1>-<2>-<3>-<4>-<9>-");
using Spli35 = Splice<BaLi5, OLi3, 5>; EXPECT (Spli35, "-<1>-<2>-<3>-<4>-<5>-");
using Spli36 = Splice<BaLi5, OLi3, 8>; EXPECT (Spli36, "-<1>-<2>-<3>-<4>-<5>-");
// (2b) corresponding Front / Back cases
using Frnt16 = Splice<BaLi5, OLi1> ::Front; EXPECT (Frnt16, "-");
using Frnt17 = Splice<BaLi5, OLi1, 1>::Front; EXPECT (Frnt17, "-<1>-");
using Frnt18 = Splice<BaLi5, OLi1, 2>::Front; EXPECT (Frnt18, "-<1>-<2>-");
using Frnt19 = Splice<BaLi5, OLi1, 3>::Front; EXPECT (Frnt19, "-<1>-<2>-<3>-");
using Frnt20 = Splice<BaLi5, OLi1, 4>::Front; EXPECT (Frnt20, "-<1>-<2>-<3>-<4>-");
using Frnt21 = Splice<BaLi5, OLi1, 5>::Front; EXPECT (Frnt21, "-<1>-<2>-<3>-<4>-<5>-");
using Frnt22 = Splice<BaLi5, OLi1, 8>::Front; EXPECT (Frnt22, "-<1>-<2>-<3>-<4>-<5>-");
using Frnt23 = Splice<BaLi5, OLi2, 0>::Front; EXPECT (Frnt23, "-");
using Frnt24 = Splice<BaLi5, OLi2, 1>::Front; EXPECT (Frnt24, "-<1>-");
using Frnt25 = Splice<BaLi5, OLi2, 2>::Front; EXPECT (Frnt25, "-<1>-<2>-");
using Frnt26 = Splice<BaLi5, OLi2, 3>::Front; EXPECT (Frnt26, "-<1>-<2>-<3>-");
using Frnt27 = Splice<BaLi5, OLi2, 4>::Front; EXPECT (Frnt27, "-<1>-<2>-<3>-<4>-");
using Frnt28 = Splice<BaLi5, OLi2, 5>::Front; EXPECT (Frnt28, "-<1>-<2>-<3>-<4>-<5>-");
using Frnt29 = Splice<BaLi5, OLi2, 8>::Front; EXPECT (Frnt29, "-<1>-<2>-<3>-<4>-<5>-");
using Frnt30 = Splice<BaLi5, OLi3, 0>::Front; EXPECT (Frnt30, "-");
using Frnt31 = Splice<BaLi5, OLi3, 1>::Front; EXPECT (Frnt31, "-<1>-");
using Frnt32 = Splice<BaLi5, OLi3, 2>::Front; EXPECT (Frnt32, "-<1>-<2>-");
using Frnt33 = Splice<BaLi5, OLi3, 3>::Front; EXPECT (Frnt33, "-<1>-<2>-<3>-");
using Frnt34 = Splice<BaLi5, OLi3, 4>::Front; EXPECT (Frnt34, "-<1>-<2>-<3>-<4>-");
using Frnt35 = Splice<BaLi5, OLi3, 5>::Front; EXPECT (Frnt35, "-<1>-<2>-<3>-<4>-<5>-");
using Frnt36 = Splice<BaLi5, OLi3, 8>::Front; EXPECT (Frnt36, "-<1>-<2>-<3>-<4>-<5>-");
using Back16 = Splice<BaLi5, OLi1> ::Back; EXPECT (Back16, "-<2>-<3>-<4>-<5>-");
using Back17 = Splice<BaLi5, OLi1, 1>::Back; EXPECT (Back17, "-<3>-<4>-<5>-");
using Back18 = Splice<BaLi5, OLi1, 2>::Back; EXPECT (Back18, "-<4>-<5>-");
using Back19 = Splice<BaLi5, OLi1, 3>::Back; EXPECT (Back19, "-<5>-");
using Back20 = Splice<BaLi5, OLi1, 4>::Back; EXPECT (Back20, "-");
using Back21 = Splice<BaLi5, OLi1, 5>::Back; EXPECT (Back21, "-");
using Back22 = Splice<BaLi5, OLi1, 8>::Back; EXPECT (Back22, "-");
using Back23 = Splice<BaLi5, OLi2, 0>::Back; EXPECT (Back23, "-<3>-<4>-<5>-");
using Back24 = Splice<BaLi5, OLi2, 1>::Back; EXPECT (Back24, "-<4>-<5>-");
using Back25 = Splice<BaLi5, OLi2, 2>::Back; EXPECT (Back25, "-<5>-");
using Back26 = Splice<BaLi5, OLi2, 3>::Back; EXPECT (Back26, "-");
using Back27 = Splice<BaLi5, OLi2, 4>::Back; EXPECT (Back27, "-");
using Back28 = Splice<BaLi5, OLi2, 5>::Back; EXPECT (Back28, "-");
using Back29 = Splice<BaLi5, OLi2, 8>::Back; EXPECT (Back29, "-");
using Back30 = Splice<BaLi5, OLi3, 0>::Back; EXPECT (Back30, "-<4>-<5>-");
using Back31 = Splice<BaLi5, OLi3, 1>::Back; EXPECT (Back31, "-<5>-");
using Back32 = Splice<BaLi5, OLi3, 2>::Back; EXPECT (Back32, "-");
using Back33 = Splice<BaLi5, OLi3, 3>::Back; EXPECT (Back33, "-");
using Back34 = Splice<BaLi5, OLi3, 4>::Back; EXPECT (Back34, "-");
using Back35 = Splice<BaLi5, OLi3, 5>::Back; EXPECT (Back35, "-");
using Back36 = Splice<BaLi5, OLi3, 8>::Back; EXPECT (Back36, "-");
/////////////////////////////////////////////////////////
// (3) degenerate case : excess overlay over smaller base
using Spli37 = Splice<BaLi2, OLi3, 0>; EXPECT (Spli37, "-<9>-<8>-");
using Spli38 = Splice<BaLi2, OLi3, 1>; EXPECT (Spli38, "-<1>-<9>-");
using Spli39 = Splice<BaLi2, OLi3, 2>; EXPECT (Spli39, "-<1>-<2>-");
using Spli40 = Splice<BaLi2, OLi3, 5>; EXPECT (Spli40, "-<1>-<2>-");
using Spli41 = Splice<BaLi1, OLi3, 0>; EXPECT (Spli41, "-<9>-");
using Spli42 = Splice<BaLi1, OLi3, 1>; EXPECT (Spli42, "-<1>-");
using Spli43 = Splice<BaLi1, OLi3, 2>; EXPECT (Spli43, "-<1>-");
using Spli44 = Splice<BaLi1, OLi3, 5>; EXPECT (Spli44, "-<1>-");
// (3b) corresponding Front / Back cases
using Frnt37 = Splice<BaLi2, OLi3, 0>::Front; EXPECT (Frnt37, "-");
using Frnt38 = Splice<BaLi2, OLi3, 1>::Front; EXPECT (Frnt38, "-<1>-");
using Frnt39 = Splice<BaLi2, OLi3, 2>::Front; EXPECT (Frnt39, "-<1>-<2>-");
using Frnt40 = Splice<BaLi2, OLi3, 5>::Front; EXPECT (Frnt40, "-<1>-<2>-");
using Frnt41 = Splice<BaLi1, OLi3, 0>::Front; EXPECT (Frnt41, "-");
using Frnt42 = Splice<BaLi1, OLi3, 1>::Front; EXPECT (Frnt42, "-<1>-");
using Frnt43 = Splice<BaLi1, OLi3, 2>::Front; EXPECT (Frnt43, "-<1>-");
using Frnt44 = Splice<BaLi1, OLi3, 5>::Front; EXPECT (Frnt44, "-<1>-");
using Back37 = Splice<BaLi2, OLi3, 0>::Back; EXPECT (Back37, "-");
using Back38 = Splice<BaLi2, OLi3, 1>::Back; EXPECT (Back38, "-");
using Back39 = Splice<BaLi2, OLi3, 2>::Back; EXPECT (Back39, "-");
using Back40 = Splice<BaLi2, OLi3, 5>::Back; EXPECT (Back40, "-");
using Back41 = Splice<BaLi1, OLi3, 0>::Back; EXPECT (Back41, "-");
using Back42 = Splice<BaLi1, OLi3, 1>::Back; EXPECT (Back42, "-");
using Back43 = Splice<BaLi1, OLi3, 2>::Back; EXPECT (Back43, "-");
using Back44 = Splice<BaLi1, OLi3, 5>::Back; EXPECT (Back44, "-");
///////////////////////////////////
// (4) degenerate case : empty base
using Spli45 = Splice<Nil, OLi3, 0>; EXPECT (Spli45, "-");
using Spli46 = Splice<Nil, OLi3, 1>; EXPECT (Spli46, "-");
using Spli47 = Splice<Nil, OLi3, 5>; EXPECT (Spli47, "-");
using Spli48 = Splice<Nil, OLi1, 0>; EXPECT (Spli48, "-");
using Spli49 = Splice<Nil, OLi1, 1>; EXPECT (Spli49, "-");
using Spli50 = Splice<Nil, OLi1, 5>; EXPECT (Spli50, "-");
using Spli51 = Splice<Nil, Nil, 0>; EXPECT (Spli51, "-");
using Spli52 = Splice<Nil, Nil, 1>; EXPECT (Spli52, "-");
using Spli53 = Splice<Nil, Nil, 5>; EXPECT (Spli53, "-");
// (4b) corresponding Front / Back cases
using Frnt45 = Splice<Nil, OLi3, 0>::Front; EXPECT (Frnt45, "-");
using Frnt46 = Splice<Nil, OLi3, 1>::Front; EXPECT (Frnt46, "-");
using Frnt47 = Splice<Nil, OLi3, 5>::Front; EXPECT (Frnt47, "-");
using Frnt48 = Splice<Nil, OLi1, 0>::Front; EXPECT (Frnt48, "-");
using Frnt49 = Splice<Nil, OLi1, 1>::Front; EXPECT (Frnt49, "-");
using Frnt50 = Splice<Nil, OLi1, 5>::Front; EXPECT (Frnt50, "-");
using Frnt51 = Splice<Nil, Nil, 0>::Front; EXPECT (Frnt51, "-");
using Frnt52 = Splice<Nil, Nil, 1>::Front; EXPECT (Frnt52, "-");
using Frnt53 = Splice<Nil, Nil, 5>::Front; EXPECT (Frnt53, "-");
using Back45 = Splice<Nil, OLi3, 0>::Back; EXPECT (Back45, "-");
using Back46 = Splice<Nil, OLi3, 1>::Back; EXPECT (Back46, "-");
using Back47 = Splice<Nil, OLi3, 5>::Back; EXPECT (Back47, "-");
using Back48 = Splice<Nil, OLi1, 0>::Back; EXPECT (Back48, "-");
using Back49 = Splice<Nil, OLi1, 1>::Back; EXPECT (Back49, "-");
using Back50 = Splice<Nil, OLi1, 5>::Back; EXPECT (Back50, "-");
using Back51 = Splice<Nil, Nil, 0>::Back; EXPECT (Back51, "-");
using Back52 = Splice<Nil, Nil, 1>::Back; EXPECT (Back52, "-");
using Back53 = Splice<Nil, Nil, 5>::Back; EXPECT (Back53, "-");
//////////////////////////////////////////
// (4) special case : zero-splice is split
using Spli54 = Splice<BaLi3, Nil, 0>; EXPECT (Spli54, "-<1>-<2>-<3>-");
using Spli55 = Splice<BaLi3, Nil, 1>; EXPECT (Spli55, "-<1>-<2>-<3>-");
using Spli56 = Splice<BaLi3, Nil, 2>; EXPECT (Spli56, "-<1>-<2>-<3>-");
using Spli57 = Splice<BaLi3, Nil, 3>; EXPECT (Spli57, "-<1>-<2>-<3>-");
using Spli58 = Splice<BaLi3, Nil, 4>; EXPECT (Spli58, "-<1>-<2>-<3>-");
using Spli59 = Splice<BaLi3, Nil, 5>; EXPECT (Spli59, "-<1>-<2>-<3>-");
// (4b) Front / Back cases : split parts
using Frnt54 = Splice<BaLi3, Nil, 0>::Front; EXPECT (Frnt54, "-");
using Frnt55 = Splice<BaLi3, Nil, 1>::Front; EXPECT (Frnt55, "-<1>-");
using Frnt56 = Splice<BaLi3, Nil, 2>::Front; EXPECT (Frnt56, "-<1>-<2>-");
using Frnt57 = Splice<BaLi3, Nil, 3>::Front; EXPECT (Frnt57, "-<1>-<2>-<3>-");
using Frnt58 = Splice<BaLi3, Nil, 4>::Front; EXPECT (Frnt58, "-<1>-<2>-<3>-");
using Frnt59 = Splice<BaLi3, Nil, 5>::Front; EXPECT (Frnt59, "-<1>-<2>-<3>-");
using Back54 = Splice<BaLi3, Nil, 0>::Back; EXPECT (Back54, "-<1>-<2>-<3>-");
using Back55 = Splice<BaLi3, Nil, 1>::Back; EXPECT (Back55, "-<2>-<3>-");
using Back56 = Splice<BaLi3, Nil, 2>::Back; EXPECT (Back56, "-<3>-");
using Back57 = Splice<BaLi3, Nil, 3>::Back; EXPECT (Back57, "-");
using Back58 = Splice<BaLi3, Nil, 4>::Back; EXPECT (Back58, "-");
using Back59 = Splice<BaLi3, Nil, 5>::Back; EXPECT (Back59, "-");
// Note: these special usages are provided as shorthand
using Prfx55 = Prefix<BaLi3, 1>; EXPECT (Prfx55, "-<1>-");
using Sufx55 = Suffix<BaLi3, 1>; EXPECT (Sufx55, "-<2>-<3>-");
using Prfx56 = Prefix<BaLi3, 2>; EXPECT (Prfx56, "-<1>-<2>-");
using Sufx56 = Suffix<BaLi3, 2>; EXPECT (Sufx56, "-<3>-");
}

View file

@ -164428,8 +164428,7 @@ Since then others have made contributions, see the log for the history.</font></
da es auf std::get&lt;i&gt; mit frest verdrahtetem Index aufsetzt
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
<node CREATED="1749082438789" ID="ID_477817163" MODIFIED="1749082442014" TEXT="nun...">
@ -164438,11 +164437,12 @@ Since then others have made contributions, see the log for the history.</font></
<node CREATED="1749082466958" ID="ID_1265074650" MODIFIED="1749082473555" TEXT="&#x27f9; Compilation-Failure im Binder"/>
</node>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1749082478231" ID="ID_1161415270" MODIFIED="1749082494638" TEXT="kann man das bestehende Verhalten erhalten?">
<node COLOR="#435e98" CREATED="1749082478231" ID="ID_1161415270" MODIFIED="1749137091814" TEXT="kann man das bestehende Verhalten erhalten?">
<icon BUILTIN="help"/>
<node CREATED="1749082495532" ID="ID_367606531" MODIFIED="1749082502619" TEXT="wei&#xdf; zwar nicht ob das sinnvoll ist...?"/>
<node CREATED="1749082503424" ID="ID_1896561211" MODIFIED="1749082514629" TEXT="aber es gibt einen Test und es ist so dokumentiert"/>
<node CREATED="1749082714136" ID="ID_1965208394" MODIFIED="1749082734615" TEXT="also &#x27f9; wie kommt die L&#xe4;nge des Binder-Tuples in BindToArg zustande?">
<node COLOR="#435e98" CREATED="1749082714136" FOLDED="true" ID="ID_1965208394" MODIFIED="1749137084537" TEXT="also &#x27f9; wie kommt die L&#xe4;nge des Binder-Tuples in BindToArg zustande?">
<arrowlink COLOR="#fefbd6" DESTINATION="ID_1677536516" ENDARROW="Default" ENDINCLINATION="-312;-26;" ID="Arrow_ID_1066352629" STARTARROW="None" STARTINCLINATION="593;24;"/>
<node CREATED="1749085756772" ID="ID_1774712935" MODIFIED="1749085768340" TEXT="es wird aus drei Teilen zusammengesetzt"/>
<node CREATED="1749085769610" ID="ID_1876115458" MODIFIED="1749085780773" TEXT="und Pr&#xe4;fix/Suffix beruhen auf der angegebenen pos"/>
<node CREATED="1749085786524" ID="ID_1747871175" MODIFIED="1749085803306" TEXT="Zugriff vewendet die Splice-Metafunktion">
@ -164452,8 +164452,9 @@ Since then others have made contributions, see the log for the history.</font></
<node CREATED="1749086180059" ID="ID_1000117906" MODIFIED="1749086190840" TEXT="es ist mehr wie ein &#xbb;slide edit&#xab;"/>
<node CREATED="1749086192917" ID="ID_51185866" MODIFIED="1749086202659" TEXT="gepr&#xfc;ft: es gibt nur diese eine Verwendung"/>
</node>
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1749086082424" ID="ID_792762505" MODIFIED="1749086090303" TEXT="Fehler in List-Splice">
<node COLOR="#5b280f" CREATED="1749086082424" FOLDED="true" ID="ID_792762505" MODIFIED="1749136865497" TEXT="Fehler in List-Splice">
<icon BUILTIN="broken-line"/>
<icon BUILTIN="button_cancel"/>
<node CREATED="1749086093678" ID="ID_1935542921" MODIFIED="1749086103057" TEXT="dank umgeschriebenen Test jetzt klar zu sehen">
<node CREATED="1749086219612" ID="ID_1085792366" MODIFIED="1749086248922" TEXT="OLi : -&lt;9&gt;-&lt;8&gt;-"/>
<node CREATED="1749086269399" ID="ID_878268645" MODIFIED="1749086278084" TEXT="List1: -&lt;1&gt;-&lt;2&gt;-&lt;3&gt;-"/>
@ -164499,8 +164500,7 @@ Since then others have made contributions, see the log for the history.</font></
<font size="2">&#187; off by one &#171;</font>
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="broken-line"/>
<node CREATED="1749089660750" ID="ID_1758217572" MODIFIED="1749089678824" TEXT="sonderbar: dieser Fehler besteht so schon lange....">
<icon BUILTIN="clanbomber"/>
@ -164511,11 +164511,160 @@ Since then others have made contributions, see the log for the history.</font></
<icon BUILTIN="button_cancel"/>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1749090267058" ID="ID_541383828" MODIFIED="1749090428234" TEXT="Fokussierte Untersuchung notwendig!">
<node COLOR="#5b280f" CREATED="1749128362887" ID="ID_1714360602" MODIFIED="1749128402891" TEXT="STOP: hier funktioniert alles">
<icon BUILTIN="closed"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1749128408112" ID="ID_1682700621" MODIFIED="1749128444261" TEXT="kein Fehler in List-Splice">
<linktarget COLOR="#6f7598" DESTINATION="ID_1682700621" ENDARROW="Default" ENDINCLINATION="21;247;" ID="Arrow_ID_854761063" SOURCE="ID_385899449" STARTARROW="None" STARTINCLINATION="-365;29;"/>
<icon BUILTIN="smiley-angry"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1749090267058" ID="ID_541383828" MODIFIED="1749136898652" TEXT="Fokussierte Untersuchung notwendig!">
<icon BUILTIN="yes"/>
<node COLOR="#5b280f" CREATED="1749121913400" FOLDED="true" ID="ID_1387809956" MODIFIED="1749136875547" TEXT="erst mal: Splice-Verhalten">
<icon BUILTIN="help"/>
<icon BUILTIN="button_cancel"/>
<node CREATED="1749121939226" ID="ID_637516691" MODIFIED="1749121966264" TEXT="das ist ein &#x201e;echt jetzt?&#x201c;-Test"/>
<node COLOR="#435e98" CREATED="1749121967392" ID="ID_1112761959" MODIFIED="1749130939350" TEXT="brauche volle Fallkombination">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
ECHT JETZT!
</p>
<p>
Es geht um <b>Intervall-Relationen</b>&#160;&#8212; bekannterma&#223;en eines der (fast) ekelhaftesten Fallunterscheidungen (Lage von Raumgebieten zueinander oder teilweise &#228;hnlichen Topologien zueinander ist noch schrecklicher)
</p>
</body>
</html></richcontent>
<icon BUILTIN="yes"/>
<node CREATED="1749121975569" ID="ID_1446200422" MODIFIED="1749121988950" TEXT="Position jeweils">
<node COLOR="#5e7e91" CREATED="1749122041338" ID="ID_1056644148" MODIFIED="1749122091062" TEXT="(links au&#xdf;en unm&#xf6;glich)">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
da als rekursive Berechnung implementiert und der pos-Parameter auch korrekt als uint definiert
</p>
</body>
</html></richcontent>
<font NAME="SansSerif" SIZE="10"/>
</node>
<node CREATED="1749121990017" ID="ID_1788372706" MODIFIED="1749121999308" TEXT="linker Rand"/>
<node CREATED="1749122003143" ID="ID_618160479" MODIFIED="1749122010310" TEXT="Innenbereich"/>
<node CREATED="1749122012526" ID="ID_357846463" MODIFIED="1749122016476" TEXT="rechts b&#xfc;ndig"/>
<node CREATED="1749122017266" ID="ID_104294290" MODIFIED="1749122021056" TEXT="rechts &#xfc;berlappend"/>
<node CREATED="1749122021393" ID="ID_162203580" MODIFIED="1749122026669" TEXT="rechts au&#xdf;erhalb"/>
</node>
<node CREATED="1749122107913" ID="ID_97606834" MODIFIED="1749122110525" TEXT="Overlays">
<node CREATED="1749122111511" ID="ID_883140295" MODIFIED="1749122116769" TEXT="1-elementig"/>
<node CREATED="1749122117365" ID="ID_689358826" MODIFIED="1749122121795" TEXT="2-elementig"/>
<node CREATED="1749122122743" ID="ID_1402014204" MODIFIED="1749122127694" TEXT="3-elementig"/>
<node CREATED="1749122138685" ID="ID_486640344" MODIFIED="1749122139873" TEXT="leer"/>
</node>
<node CREATED="1749122141461" ID="ID_1512239211" MODIFIED="1749122144250" TEXT="Basislisten">
<node CREATED="1749122145251" ID="ID_1489241747" MODIFIED="1749122150725" TEXT="3-elementig"/>
<node CREATED="1749122151858" ID="ID_1187303971" MODIFIED="1749122155841" TEXT="5-elementig"/>
<node CREATED="1749122494571" ID="ID_547342416" MODIFIED="1749122522364" TEXT="2-elementig"/>
<node CREATED="1749122523130" ID="ID_566182892" MODIFIED="1749122526460" TEXT="1-elementig"/>
<node CREATED="1749122527209" ID="ID_809047392" MODIFIED="1749122529258" TEXT="leer"/>
</node>
</node>
<node COLOR="#338800" CREATED="1749122263404" ID="ID_421629155" MODIFIED="1749130941827" TEXT="Test komplett neu runterklopfen">
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#ff00cd" CREATED="1749128173762" ID="ID_368064208" MODIFIED="1749128192153" TEXT="zOMG">
<icon BUILTIN="smily_bad"/>
</node>
<node BACKGROUND_COLOR="#a8a8bf" COLOR="#2f6210" CREATED="1749128228587" ID="ID_385899449" MODIFIED="1749128454852" TEXT="leider Nein: alles wie erwartet">
<arrowlink COLOR="#6f7598" DESTINATION="ID_1682700621" ENDARROW="Default" ENDINCLINATION="21;247;" ID="Arrow_ID_854761063" STARTARROW="None" STARTINCLINATION="-365;29;"/>
<icon BUILTIN="back"/>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1749130960161" ID="ID_1423104834" MODIFIED="1749136753253" TEXT="dann: fragliche Situation schrittweise aufbauen">
<icon BUILTIN="yes"/>
<node CREATED="1749135516159" ID="ID_771788486" MODIFIED="1749135572733" TEXT="FunctionComposition_test::check_bindToArbitraryParameter"/>
<node CREATED="1749135574065" ID="ID_1658667842" MODIFIED="1749135594450" TEXT="hier wird dieser problematische Grenzfall ebenfalls mit abgedeckt"/>
<node CREATED="1749135599358" ID="ID_12902561" MODIFIED="1749135607346" TEXT="verwende nochmal die alte Implementierung"/>
<node CREATED="1749135608311" ID="ID_539233629" MODIFIED="1749135621803" TEXT="mache einfach die internen Type-defs zug&#xe4;nglich"/>
<node BACKGROUND_COLOR="#e3dbae" CREATED="1749135655444" ID="ID_1677536516" MODIFIED="1749136790143" TEXT="Problem ist ganz einfach...">
<linktarget COLOR="#fefbd6" DESTINATION="ID_1677536516" ENDARROW="Default" ENDINCLINATION="-312;-26;" ID="Arrow_ID_1066352629" SOURCE="ID_1965208394" STARTARROW="None" STARTINCLINATION="593;24;"/>
<icon BUILTIN="idea"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#dd01af" CREATED="1749135685273" ID="ID_1646532463" MODIFIED="1749135896001" TEXT="was bin ich f&#xfc;r ein Esel">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
Warum hab ich das nicht gleich gesehen?????
</p>
<ul>
<li>
Ich hatte alle relevanten Informationen bereits gestern Nacht, aus dem Compile-Fehler
</li>
<li>
hab dann wohl einen Tunellblick gehabt, und dann sofort nach der Splice-Implementierung als &#187;Strohhalm&#171; gegriffen, denn das ist was Systematisches
</li>
<li>
und heute hab ich jetzt ein paar Stunden damit verbracht, einen systematischen Testfall runterzuklopfen (was nun immerhin eine vertrauensbildende Ma&#223;name ist, denn die Splice-Metafunktion <i>ist definitiv komplex</i>)
</li>
</ul>
</body>
</html>
</richcontent>
<icon BUILTIN="smily_bad"/>
</node>
<node CREATED="1749135899620" ID="ID_717531911" MODIFIED="1749136016376" TEXT="die alte Implementierung hat ganz &#xbb;elegant&#xab; ausgenutzt, da&#xdf; unser Bind-to-Tuple beschneidet">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
also vermutlich war mir das damals so v&#246;llig klar, da&#223; ich es einfach gemacht habe, ohne einen Kommentar zu hinterlassen; es war ja auch eine Spezialanfertigung f&#252;r diesen einen Fall, und explizit f&#252;r 1..9 Parameter so ausgeklopft
</p>
</body>
</html>
</richcontent>
</node>
<node CREATED="1749136018329" ID="ID_286675786" MODIFIED="1749136040691" TEXT="deshalb konnte man zulassen, da&#xdf; im out-of-bounds-Fall einfach eine zu lange Liste entsteht"/>
<node CREATED="1749136045930" ID="ID_1875577568" MODIFIED="1749136073330" TEXT="liegt lediglich daran, da&#xdf; dann eben schon der Front-Teil die gesamte Original-Liste enth&#xe4;lt"/>
<node CREATED="1749136081259" ID="ID_520285904" MODIFIED="1749136096661" TEXT="und der Code dann blindlings noch das Value-Tupel dranh&#xe4;ngt"/>
</node>
<node COLOR="#338800" CREATED="1749136099720" ID="ID_505387580" MODIFIED="1749136694912" TEXT="Abhilfe">
<icon BUILTIN="button_ok"/>
<node CREATED="1749136114759" ID="ID_681718012" MODIFIED="1749136133620" TEXT="BindToArgument::PreparedArgs nicht nur per Append zusammenh&#xe4;ngen"/>
<node CREATED="1749136134368" ID="ID_1812769735" MODIFIED="1749136975445" TEXT="sondern sofort auch gleich auf das Pr&#xe4;fix der richtigen L&#xe4;nge stutzen">
<linktarget COLOR="#dafdce" DESTINATION="ID_1812769735" ENDARROW="Default" ENDINCLINATION="-413;16;" ID="Arrow_ID_161658453" SOURCE="ID_1705757881" STARTARROW="None" STARTINCLINATION="393;-10;"/>
</node>
<node COLOR="#435e98" CREATED="1749136149348" ID="ID_727667602" MODIFIED="1749136697664" TEXT="kann daf&#xfc;r Splice verwenden">
<icon BUILTIN="idea"/>
<node CREATED="1749136164904" ID="ID_765120873" MODIFIED="1749136714537" TEXT="mit einem Nil-Overlay">
<icon BUILTIN="info"/>
</node>
<node COLOR="#435e98" CREATED="1749136171879" ID="ID_219649908" MODIFIED="1749136707713" TEXT="definiere daf&#xfc;r eine Abk&#xfc;rzung">
<icon BUILTIN="yes"/>
<node CREATED="1749136188701" ID="ID_1987132867" MODIFIED="1749136199343" TEXT="Prefix&lt;LI, p&gt;"/>
<node CREATED="1749136200140" ID="ID_178861800" MODIFIED="1749136205897" TEXT="Suffix&lt;LI, p&gt;"/>
</node>
</node>
</node>
</node>
</node>
</node>
<node CREATED="1749136902974" ID="ID_1705757881" MODIFIED="1749136983225" TEXT="Fazit: indem man explizit das Binder-Tupel auf L&#xe4;nge der Funktions-Argumentliste kappt">
<arrowlink COLOR="#dafdce" DESTINATION="ID_1812769735" ENDARROW="Default" ENDINCLINATION="-413;16;" ID="Arrow_ID_161658453" STARTARROW="None" STARTINCLINATION="393;-10;"/>
<icon BUILTIN="back"/>
<node BACKGROUND_COLOR="#e3dbae" COLOR="#3a700e" CREATED="1749136997746" HGAP="28" ID="ID_750676907" MODIFIED="1749137070625" STYLE="fork" TEXT="(was die handgeschriebene Apply&lt;ARG_CNT&gt;::bind implzit auch getan hat)" VSHIFT="19">
<edge COLOR="#808080" STYLE="bezier" WIDTH="thin"/>
<font NAME="SansSerif" SIZE="8"/>
</node>
</node>
</node>
@ -164594,6 +164743,35 @@ Since then others have made contributions, see the log for the history.</font></
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#cd016f" CREATED="1748993653112" ID="ID_1058696109" MODIFIED="1748993677622" TEXT="Stackoverflow in Eclipse">
<font NAME="SansSerif" SIZE="10"/>
<icon BUILTIN="smiley-angry"/>
<node CREATED="1749132089784" ID="ID_939851572" MODIFIED="1749132196714">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
<u>Trigger</u>...
</p>
<p>
jeder vollst&#228;ndige Aufruf von
</p>
<p>
<font face="Monospaced" color="#b70606">func::bindFirst(f, val) </font>
</p>
<p>
<font size="1">&#8212; oder &#8212;</font>
</p>
<p>
<font face="Monospaced" color="#b70606">func::bindLast(f, val) </font>
</p>
<p>
</p>
</body>
</html>
</richcontent>
<icon BUILTIN="broken-line"/>
</node>
</node>
</node>
<node COLOR="#435e98" CREATED="1748829512571" ID="ID_1542151497" MODIFIED="1749007468620" TEXT="GeneratorCombinations_test"/>