Am 07.08.2009 um 14:33 schrieb Aditya Mahajan:

When I started using context, I was surprised that context did not have anything for optional arguments. We could have something like

\definesinglearugment\foo[#1]#2{...}

to be equal to

\def\foo{\dosingleargument\dofoo}
\def\dofoo[#1]#2{...}

and

\definesingleempty\foo[#1]#2{...]

to be equal to

\def\foo{\dosingleempty\dofoo}
\def\dofoo[#1]#2{...}

and similar things for \definedoublearugment, \definetripleargument, etc. I am not convinced that this is a good thing, but using something like this in the core may result in a 10% reduction in the code size and might kill a few dodos :)


It's now your turn to extend the macro to more optional arguments.

\def\define
 {\doifnextoptionalelse\dodefine\nodefine}

\def\nodefine{\dodefine[0]}

\def\dodefine[#1]#2%
 {\doifnextoptionalelse{\dododefine[#1]#2}{\nododefine[#1]#2}}

\def\dododefine[#1]#2[#3]#4%
 {\definecomplexorsimple#2
\setvalue{simple\strippedcsname#2}{\getvalue{complex \strippedcsname#2}[#3]}%
  \ifcase0#1\relax
     \setvalue{complex\strippedcsname#2}{#4}%
     \setvalue{simple\strippedcsname #2}{#4}%
  \or\setvalue{complex\strippedcsname#2}[##1]{#4}%
  \or\setvalue{complex\strippedcsname#2}[##1]##2{#4}%
  \or\setvalue{complex\strippedcsname#2}[##1]##2##3{#4}%
  \or\setvalue{complex\strippedcsname#2}[##1]##2##3##4{#4}%
  \or\setvalue{complex\strippedcsname#2}[##1]##2##3##4##5{#4}%
  \or\setvalue{complex\strippedcsname#2}[##1]##2##3##4##5##6{#4}%
  \or\setvalue{complex\strippedcsname#2}[##1]##2##3##4##5##6##6{#4}%
  \or\setvalue{complex\strippedcsname#2}[##1]##2##3##4##5##6##7##8{#4}%
\or\setvalue{complex\strippedcsname#2} [##1]##2##3##4##5##6##7##8##9{#4}%
  \fi}

\def\nododefine[#1]#2#3%
 {\ifx#2\undefined
  \else
    \showmessage{systems}{4}{\string#2}%
  \fi
  \ifcase0#1\def#2{#3}%
  \or\def#2##1{#3}%
  \or\def#2##1##2{#3}%
  \or\def#2##1##2##3{#3}%
  \or\def#2##1##2##3##4{#3}%
  \or\def#2##1##2##3##4##5{#3}%
  \or\def#2##1##2##3##4##5##6{#3}%
  \or\def#2##1##2##3##4##5##6##7{#3}%
  \or\def#2##1##2##3##4##5##6##7##8{#3}%
  \or\def#2##1##2##3##4##5##6##7##8##9{#3}%
  \else\def#2{#3}%
  \fi}

\starttext

\define\foo{bar}

\define[2]\bar{bar:#1:#2}

\define[2]\help[me]{help #1 #2}

\foo

\bar{a}{b}

\help{john}

\help[you]{mike}

\stoptext

Wolfgang

_______________________________________________
dev-context mailing list
[email protected]
http://www.ntg.nl/mailman/listinfo/dev-context

Reply via email to