On Tue, 8 Oct 2019, Rudolf Bahr wrote:

On Sun, Oct 06, 2019 at 10:44:12PM +0200, Wolfgang Schuster wrote:

While it is true that you're free to choose the name for the keys there are
two keys with a special meaning, these two keys are "reset" and "set". The
value of the "reset" key is used before the values in \setvariables are
stored while "set" is used after the values are stored.

Hello Wolfgang,

thank you very much for your detailed answer and your two examples!

Concerning the two keys with a special meaning, "reset" and "set", remains a 
question
to me. For what are they good? Does "reset" clear a data area, namespace 
perhaps,
before new data are stored there? If they are keys, what is there value or are 
they
commands?

Let's start with a simple example:

\setvariables
    [dummy]
    [
      set={AAA},
      reset={BBB},
    ]

\starttext
Hello World!
\setvariables[dummy][key=value]
\stoptext

When the \setvariables[dummy][key=value] is called, it first executes the value of `reset` key. So the output of the above is

```
Hello World! BBBAAA
```

Now suppose you want to do some calculations based on the value of passed key. Let's take a variation of the original question, and define a macro where we can say

\setvariables[exam][points=5]
\setvariables[exam][points=10]

and we can a macro \totalpoints to show the number of points. (There are probably better ways to do this than setvariables ...)

Here is one way to define it:

\def\totalpoints{0}
\setvariables
    [exam]
    [
      points=0, % This is important.
      set={\edef\totalpoints{\the\numexpr(\totalpoints + 
\getvariable{exam}{points})\relax}},
    ]


\starttext
\setvariables[exam][points=5]
\setvariables[exam][points=10]
The exam has \totalpoints\ points.
\stoptext

So, everytime \setvariables is call, the value of the `set` key is executed. If I set the value of the `set` key to code that updates the value of `\totalpoints` macro, then I get the desired behavior.

Writing macros as value of a key can be cumbersome to read. So, we can use setups:

\def\totalpoints{0}

\startsetups updatepoints
      \edef\totalpoints{\the\numexpr(\totalpoints + 
\getvariable{exam}{points})\relax}
\stopsetups

\setvariables
    [exam]
    [
      points=0,
      set=\directsetup{updatepoints},
    ]

\starttext
\setvariables[exam][points=5]
\setvariables[exam][points=10]
The exam has \totalpoints\ points.
\stoptext

That's it.

Aditya
___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the 
Wiki!

maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage  : http://www.pragma-ade.nl / http://context.aanhet.net
archive  : https://bitbucket.org/phg/context-mirror/commits/
wiki     : http://contextgarden.net
___________________________________________________________________________________

Reply via email to