diff options
Diffstat (limited to 'tex/context/base/mult-aux.mkiv')
-rw-r--r-- | tex/context/base/mult-aux.mkiv | 185 |
1 files changed, 170 insertions, 15 deletions
diff --git a/tex/context/base/mult-aux.mkiv b/tex/context/base/mult-aux.mkiv index 902f88f45..444418a90 100644 --- a/tex/context/base/mult-aux.mkiv +++ b/tex/context/base/mult-aux.mkiv @@ -122,7 +122,7 @@ % End of experimental code. \unexpanded\def\interfaces_install_parameter_handler#1#2#3#4#5#6#7#8#9% inlining \csname*\endcsname is more efficient (#3 and #6 only) - {\ifx#2\relax\let#2\empty\fi % it is hardly faster but produces less expansion tracing + {\ifx#2\relax\let#2\empty\fi % it is hardly faster but produces less expansion tracing %\def#3##1{\csname#4{#1#2}{##1}\endcsname}% \def#3##1{\csname\ifcsname#1#2:##1\endcsname#1#2:##1\else\expandafter#5\csname#1#2:\s!parent\endcsname{##1}\fi\endcsname}% \def#4##1##2{\ifcsname##1:##2\endcsname##1:##2\else\expandafter#5\csname##1:\s!parent\endcsname{##2}\fi}% @@ -159,16 +159,17 @@ \unexpanded\def\interfaces_install_parameter_hash_handler#1#2#3#4#5#6#7#8#9% {\ifx#2\relax\let#2\empty\fi - \def#3##1{#4{#1#2}{##1}:}% + \def#3##1{#1#4{#1#2}{##1}:}% leading #1 was missing .. is this one used? \def#4##1##2{\ifcsname##1:##2\endcsname##1\else\expandafter#5\csname##1:\s!parent\endcsname{##2}\fi}% - \def#5##1##2{\ifx##1\relax\else#4{##1}{##2}\fi}% is {} needed around ##1 ? + \def#5##1##2{\ifx##1\relax\else#4{##1}{##2}\fi}% \def#6{#1#2:}% \def#7##1{#1##1:}% \def#8{\ifx#2\empty\else\ifcsname#1#2:\s!parent\endcsname\else\expandafter\let\csname#1#2:\s!parent\endcsname#1\fi\fi}% \unexpanded\def#9##1{\expandafter\edef\csname#1##1:\s!parent\endcsname{#1#2}}} \unexpanded\def\installparameterhashhandler#1#2% - {\normalexpanded + {\expandafter\let\csname#2namespace\endcsname#1% + \normalexpanded {\interfaces_install_parameter_hash_handler {\noexpand#1}% \??aa \expandafter\noexpand\csname current#2\endcsname @@ -183,19 +184,21 @@ % In \MKIV\ we can probably use the english variant for all other % languages too. -\unexpanded\def\interfaces_install_parameter_set_handler#1#2#3#4#5% we can speed this up for english +\unexpanded\def\interfaces_install_parameter_set_handler#1#2#3#4#5#6% we can speed this up for english {\ifx#2\relax\let#2\empty\fi - \unexpanded\def#3{\dosetvalue{#1#2:}}% ##1 {##2} (braces are mandate) - \unexpanded\def#4{\doletvalue{#1#2:}}% ##1 ##2 - \unexpanded\def#5{\doletvalue{#1#2:}\empty}}% ##1 + \unexpanded\def#3{\dosetvalue {#1#2:}}% ##1 {##2} (braces are mandate) + \unexpanded\def#4{\dosetevalue{#1#2:}}% ##1 {##2} (braces are mandate) + \unexpanded\def#5{\doletvalue {#1#2:}}% ##1 ##2 + \unexpanded\def#6{\doletvalue {#1#2:}\empty}}% ##1 \startinterface english - \unexpanded\def\interfaces_install_parameter_set_handler#1#2#3#4#5% + \unexpanded\def\interfaces_install_parameter_set_handler#1#2#3#4#5#6% {\ifx#2\relax\let#2\empty\fi - \unexpanded\def#3##1{\expandafter\def\csname#1#2:##1\endcsname}% ##1 {##2} (braces are mandate) - \unexpanded\def#4##1{\expandafter\let\csname#1#2:##1\endcsname}% ##1 ##2 - \unexpanded\def#5##1{\expandafter\let\csname#1#2:##1\endcsname\empty}}% ##1 + \unexpanded\def#3##1{\expandafter \def\csname#1#2:##1\endcsname}% ##1 {##2} (braces are mandate) + \unexpanded\def#4##1{\expandafter\edef\csname#1#2:##1\endcsname}% ##1 {##2} (braces are mandate) + \unexpanded\def#5##1{\expandafter \let\csname#1#2:##1\endcsname}% ##1 ##2 + \unexpanded\def#6##1{\expandafter \let\csname#1#2:##1\endcsname\empty}}% ##1 \stopinterface @@ -205,6 +208,7 @@ {\noexpand#1}% \??aa \expandafter\noexpand\csname current#2\endcsname \expandafter\noexpand\csname set#2parameter\endcsname + \expandafter\noexpand\csname setexpanded#2parameter\endcsname \expandafter\noexpand\csname let#2parameter\endcsname \expandafter\noexpand\csname reset#2parameter\endcsname}} @@ -425,8 +429,157 @@ \installsetuphandler {#1}{#2}% \installstyleandcolorhandler {#1}{#2}} -\unexpanded\def\installnamespace#1% - {\setvalue{????#1}{@@@@#1}} +%D Many mechanisms have some kind of inheritance in place, and these are +%D the speed||critical ones. Therefore there is no reason to stick to +%D \type {\@@xxkey} for the sake of performance. For this reason we also +%D provide a direct variant. This permits a more consistent treatment of +%D namespaces. A \type {\whateverparameter} call is three times slower +%D and a \type {\directwhateverparameter} call two times but for some +%D 100K expansions we only loose some .1 second which is neglectable +%D given the small amount of expansions in real runs. + +%D We don't need colons for such simple cases. + +\unexpanded\def\interfaces_install_direct_parameter_handler#1#2#3#4% + {\def#2##1{\csname\ifcsname#1##1\endcsname#1##1\else\s!empty\fi\endcsname}% + \def#3##1{\detokenize\expandafter\expandafter\expandafter{\csname#1##1\endcsname}}% + \def#4##1{\csname#1##1\endcsname}} + +\unexpanded\def\installdirectparameterhandler#1#2% + {\normalexpanded + {\interfaces_install_direct_parameter_handler + {\noexpand#1}% + \expandafter\noexpand\csname #2parameter\endcsname + \expandafter\noexpand\csname detokenized#2parameter\endcsname + \expandafter\noexpand\csname direct#2parameter\endcsname}} + +\unexpanded\def\interfaces_install_direct_setup_handler#1#2#3#4% + {\unexpanded\def#2{\dosingleempty#3}% + \newtoks#4% + \def#3[##1]% + {\interfaces_get_parameters#1[##1]% + \the#4}} + +\unexpanded\def\installdirectsetuphandler#1#2% + {\normalexpanded + {\interfaces_install_direct_setup_handler + {\noexpand#1}% \??aa + \expandafter\noexpand\csname setup#2\endcsname + \expandafter\noexpand\csname d@setup#2\endcsname + \expandafter\noexpand\csname everysetup#2\endcsname}} + +\unexpanded\def\interfaces_install_direct_parameter_set_handler#1#2#3#4#5% + {\unexpanded\def#2{\dosetvalue #1}% + \unexpanded\def#3{\dosetevalue#1}% + \unexpanded\def#4{\doletvalue #1}% + \unexpanded\def#5{\doletvalue #1\empty}}% + +\startinterface english + + \unexpanded\def\interfaces_install_direct_parameter_set_handler#1#2#3#4#5% + {\unexpanded\def#2##1{\expandafter \def\csname#1##1\endcsname}% + \unexpanded\def#3##1{\expandafter\edef\csname#1##1\endcsname}% + \unexpanded\def#4##1{\expandafter \let\csname#1##1\endcsname}% + \unexpanded\def#5##1{\expandafter \let\csname#1##1\endcsname\empty}}% + +\stopinterface + +\unexpanded\def\installdirectparametersethandler#1#2% + {\normalexpanded + {\interfaces_install_direct_parameter_set_handler + {\noexpand#1}% \??aa + \expandafter\noexpand\csname set#2parameter\endcsname + \expandafter\noexpand\csname setexpanded#2parameter\endcsname + \expandafter\noexpand\csname let#2parameter\endcsname + \expandafter\noexpand\csname reset#2parameter\endcsname}} + +\let\installdirectstyleandcolorhandler\installstyleandcolorhandler + +\unexpanded\def\installdirectcommandhandler#1#2% + {\installdirectparameterhandler {#1}{#2}% + \installdirectsetuphandler {#1}{#2}% + \installdirectparametersethandler {#1}{#2}% + \installdirectstyleandcolorhandler{#1}{#2}} + +% Experiment: + +% \installcorenamespace {one} +% \installcorenamespace {two} +% +% \installcommandhandler \??one {one} \??one +% \installcommandhandler \??two {two} \??two +% +% \defineone[test] \setupone[test][alpha=first] +% \definetwo[test] \setuptwo[test][beta=second] +% +% \protect +% +% \def\currentone{test} +% \def\currenttwo{test} +% +% \relateparameterhandlers {two} {test} {one} {test} +% +% yes:\oneparameter{alpha}\par +% nop:\oneparameter{beta}\par +% yes:\twoparameter{alpha}\par +% yes:\twoparameter{beta}\par + +\unexpanded\def\relateparameterhandlers#1#2#3#4% {from} {instance} {to} {instance} + {\expandafter\edef\csname\csname#1namespace\endcsname#2:\s!parent\endcsname{\csname#3namespace\endcsname#4}} + +% First we had, in tune with the regular system variables: +% +% \starttyping +% \unexpanded\def\installnamespace#1{\setvalue{????#1}{@@@@#1}} +% \stoptyping +% +% The following variant is nicer and in principle faster but that gets +% unnoticed unless lots of expansion happens. Also, we can use long tags +% but the internal expansion will be relatively small (and unlikely more +% than 4 characters). For instance, \??xx used to expand to @@xx but now +% becomes for instance 123::. This is one character more but in quite some +% cases we had : after such a tag in the old situation. In the new situation +% we create more namespaces and don't need that : any more, so we end up +% with on the average the same amount of tokens and definitely less when +% we consider cases like \??xx:\c!align: which now is just \??somealign and +% therefore has length 5 now (instead of 4+1+5+1=10). +% +% Eventualy we will have a verbose \blablanamespace and the difference between +% core and regular can go ... after all, \xxxparameter can already clash between +% the two prefix groups .. if users use this mechanism a lot they should use +% verbose names anyway (the old two character names were mostly an optimization +% as they also expanded to these characters). + +% todo: register namespaces at lua end for logging and reverse resolve +% todo: move this to syst-ini so that we can use it real early + +\newcount\interfaces_n_of_namespaces + +\def\v_interfaces_prefix_template{\number \interfaces_n_of_namespaces::} +\def\v_interfaces_prefix_template{\characters\interfaces_n_of_namespaces::} +\def\v_interfaces_prefix_template{\number \interfaces_n_of_namespaces>} +\def\v_interfaces_prefix_template{\characters\interfaces_n_of_namespaces>} + +\def\v_interfaces_prefix_template % consistently %03i> + {\ifnum\interfaces_n_of_namespaces<\plusten00\else\ifnum\interfaces_n_of_namespaces<\plushundred0\fi\fi + \number\interfaces_n_of_namespaces>} + +\unexpanded\def\installnamespace#1% for modules and users + {\ifcsname ????#1\endcsname + \writestatus\m!system{duplicate user namespace '#1'}\wait + \else + \global\advance\interfaces_n_of_namespaces\plusone + \expandafter\edef\csname ????#1\endcsname{\v_interfaces_prefix_template}% + \fi} + +\unexpanded\def\installcorenamespace#1% + {\ifcsname ??#1\endcsname + \writestatus\m!system{duplicate core namespace '#1'}\wait + \else + \global\advance\interfaces_n_of_namespaces\plusone + \expandafter\edef\csname ??#1\endcsname{\v_interfaces_prefix_template}% + \ctxcommand{registernamespace(\number\interfaces_n_of_namespaces,"#1")}% + \fi} % \enabletrackers[interfaces.namespaces,context.flush] % @@ -463,6 +616,8 @@ % “\testparameter{text}” % % \stoptext +% +% This is a user (module) command: \unexpanded\def\definenamespace {\dodoubleargument\interfaces_define_name_space} @@ -479,7 +634,7 @@ %D \showparentchain{@@am}{left} %D \stoptyping -\def\showparentchain#1#2% +\unexpanded\def\showparentchain#1#2% {\writestatus\m!system{chain: [ \interfaces_show_parent_chain{#1#2}]}} \def\interfaces_show_parent_chain#1% |