summaryrefslogtreecommitdiff
path: root/tex/context/base/mult-aux.mkiv
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/mult-aux.mkiv')
-rw-r--r--tex/context/base/mult-aux.mkiv185
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%