How to let a macro check the previous value of #1 the last time the same macro was called?
Is there a way for a macro to check the previous value of #1, the last time that same macro was called? Here is a minimum working example, pretending that `\previousvalue` is equal to #1 from the last time the same macro was called: \define[1]\mymacro{ \if\previousvalue=#1 same as last time \else it is different from last time \fi } \starttext \mymacro{cat} \mymacro{cat} \mymacro{mouse} \mymacro{mouse} \mymacro{cat} \stoptext This would print: it is different from last time <--it was never called previously same as last time it is different from last time same as last time it is different from last time --Joel
Joel via ntg-context schrieb am 09.01.2022 um 15:16:
Is there a way for a macro to check the previous value of #1, the last time that same macro was called?
Here is a minimum working example, pretending that `\previousvalue` is equal to #1 from the last time the same macro was called:
[...]
To check is the current value differs from the last one you need a temp macro where you store the current value at the end of your command to check it in the next call. \let\previousmymacro\empty \define[1]\mymacro {\edef\currentmymacro{#1}% \ifx\previousmymacro\currentmymacro same as last time \else it is different from last time \fi \let\previousmymacro\currentmymacro} \starttext \startlines cat: \mymacro{cat} cat: \mymacro{cat} mouse: \mymacro{mouse} mouse: \mymacro{mouse} cat: \mymacro{cat} \stoplines \stoptext Wolfgang
Am 09.01.22 um 16:03 schrieb Wolfgang Schuster via ntg-context:
Joel via ntg-context schrieb am 09.01.2022 um 15:16:
Is there a way for a macro to check the previous value of #1, the last time that same macro was called?
To check is the current value differs from the last one you need a temp macro where you store the current value at the end of your command to check it in the next call.
Would it make more sense, or would it be “cleaner” to use a variable? Hraban
Henning Hraban Ramm via ntg-context schrieb am 10.01.2022 um 09:52:
Am 09.01.22 um 16:03 schrieb Wolfgang Schuster via ntg-context:
Joel via ntg-context schrieb am 09.01.2022 um 15:16:
Is there a way for a macro to check the previous value of #1, the last time that same macro was called?
To check is the current value differs from the last one you need a temp macro where you store the current value at the end of your command to check it in the next call.
Would it make more sense, or would it be “cleaner” to use a variable?
You can get rid of the temp variable before the command definition but now you have to access it with a different method in \mymacro, below is one way (LMTX only) but \setvariable and \getvariable work as well. \define[1]\mymacro {\iftok{#1}{\getvalue{previousmymacro}}% same as last time \else it is different from last time \fi \setvalue{previousmymacro}{#1}} Wolfgang
Am 10.01.22 um 20:21 schrieb Wolfgang Schuster:
Henning Hraban Ramm via ntg-context schrieb am 10.01.2022 um 09:52:
Would it make more sense, or would it be “cleaner” to use a variable?
You can get rid of the temp variable before the command definition but now you have to access it with a different method in \mymacro, below is one way (LMTX only) but \setvariable and \getvariable work as well.
\define[1]\mymacro {\iftok{#1}{\getvalue{previousmymacro}}% same as last time \else it is different from last time \fi \setvalue{previousmymacro}{#1}}
That was the approach that I meant. Thank you. But would you consider one way to be better? Hraban
On Tue, 11 Jan 2022, Henning Hraban Ramm via ntg-context wrote:
Am 10.01.22 um 20:21 schrieb Wolfgang Schuster:
Henning Hraban Ramm via ntg-context schrieb am 10.01.2022 um 09:52:
Would it make more sense, or would it be “cleaner” to use a variable?
You can get rid of the temp variable before the command definition but now you have to access it with a different method in \mymacro, below is one way (LMTX only) but \setvariable and \getvariable work as well.
\define[1]\mymacro {\iftok{#1}{\getvalue{previousmymacro}}% same as last time \else it is different from last time \fi \setvalue{previousmymacro}{#1}}
That was the approach that I meant. Thank you.
But would you consider one way to be better?
Just for fun: lua code \startluacode local previous = nil interfaces.implement { name = "mymacro", public = true, arguments = "string", actions = function (current) if current == previous then context("same as last time") else context("Different!") end previous = current end, } \stopluacode \starttext \startlines cat: \mymacro{cat} cat: \mymacro{cat} mouse: \mymacro{mouse} mouse: \mymacro{mouse} cat: \mymacro{cat} \stoplines \stoptext Aditya
On 1/11/2022 5:22 AM, Aditya Mahajan via ntg-context wrote:
On Tue, 11 Jan 2022, Henning Hraban Ramm via ntg-context wrote:
Am 10.01.22 um 20:21 schrieb Wolfgang Schuster:
Henning Hraban Ramm via ntg-context schrieb am 10.01.2022 um 09:52:
Would it make more sense, or would it be “cleaner” to use a variable?
You can get rid of the temp variable before the command definition but now you have to access it with a different method in \mymacro, below is one way (LMTX only) but \setvariable and \getvariable work as well.
\define[1]\mymacro {\iftok{#1}{\getvalue{previousmymacro}}% same as last time \else it is different from last time \fi \setvalue{previousmymacro}{#1}}
That was the approach that I meant. Thank you.
But would you consider one way to be better?
Just for fun: lua code
\startluacode local previous = nil
interfaces.implement { name = "mymacro", public = true, arguments = "string", actions = function (current) if current == previous then context("same as last time") else context("Different!") end previous = current end, }
\stopluacode
\starttext
\startlines cat: \mymacro{cat} cat: \mymacro{cat} mouse: \mymacro{mouse} mouse: \mymacro{mouse} cat: \mymacro{cat} \stoplines
\stoptext
keep in mind that what you do is global (probably what one wants here): \startlines cat: \mymacro{cat} cat: \mymacro{cat} {mouse: \mymacro{mouse}} {mouse: \mymacro{mouse}} cat: \mymacro{cat} \stoplines ----------------------------------------------------------------- Hans Hagen | PRAGMA ADE Ridderstraat 27 | 8061 GH Hasselt | The Netherlands tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl -----------------------------------------------------------------
participants (5)
-
Aditya Mahajan
-
Hans Hagen
-
Henning Hraban Ramm
-
Joel
-
Wolfgang Schuster