[NTG-context] METAPOST vardef returning multiple and non-numeric types as a single answer?

Hans Hagen j.hagen at xs4all.nl
Mon Mar 16 10:38:35 CET 2020


On 3/16/2020 10:23 AM, Taco Hoekwater wrote:
> 
> 
>> On 16 Mar 2020, at 10:10, Taco Hoekwater <taco at elvenkind.com> wrote:
>>
>>
>>
>>> On 16 Mar 2020, at 09:53, Gerben Wierda <gerben.wierda at rna.nl> wrote:
>>>
>>> Hola! So, the arguments passed to macros are by reference and not by value? I could have known of course, they are simple expansions, but I’d like to be sure. IfI assign to a variable inside a vardef macro and that variable is not ’save’d I’m changing the original?
>>
>> Yes. (A simple test would have confirmed that)
> 
> Oops, sorry, no! I was wrong on that… it must be too early for me.
> 
>    vardef Foo(text y) =
>      scantokens(y&":=5”);
>    enddef;
>    Foo("x");
> 
> This would work, but that is weird. This also works, and that is why
> I had the erroneous memory that it would work always:
> 
>    vardef Foo(expr a)(text y) =
>      y[a] := 5;
>    enddef;
>    numeric foo[];
>    foo[1] = 6;
>    Foo(1,foo);
> 
> or you could use global variables, of course.
> 
> Main point: Metapost is not an easy language to grasp. If you want to
> really understand how it works, you should study the Metafont book by DEK. > As you can clearly see, even experienced users are likely to make 
mistakes.
it's the mixture of delayed parsing and expansion and ... no other 
language like that i guess (which at the same time is its charm)

passing "text y" is (i think) not that that far from the scantokens 
(running over already tokenized vs running over a string while 
tokenizing it ... but these input models (are we in scanning file input, 
string input, tokenlist) can be kind of confusing

that said, after muy share of mp programming i would not have thought 
about the text y as pass by reference, also because it's only true for 
these pseudo arrays (maybe suffixes also work)

Hans

-----------------------------------------------------------------
                                           Hans Hagen | PRAGMA ADE
               Ridderstraat 27 | 8061 GH Hasselt | The Netherlands
        tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl
-----------------------------------------------------------------


More information about the ntg-context mailing list