[metapost] On simulating def with vardef
Nicola
nvitacolonna at gmail.com
Wed Jul 1 15:52:59 CEST 2009
In article <nvitacolonna-0E0F27.11505130062009 at news.gmane.org>,
Nicola <nvitacolonna at gmail.com> wrote:
> Hi,
> I used to think that a vardef behaves like a primary because its
> replacement text is surrounded by begingroup/endgroup. But, recently, I
> have tried this:
>
> def foo = x enddef;
> foo := 1; % Ok, sets x=1
>
> vardef foovar = endgroup gobbled true x gobble begingroup enddef;
> foovar := 2; % Not ok: ! Improper `:=' will be changed to `='.
>
> I conclude that the replacement text of a vardef macro is treated as a
> primary in any case. Is it correct? Is there a way to have a vardef in
> the left hand side of an assignment in some circumstances?
>
> For those who are care, what I would like to achieve is something like:
>
> vardef suffixof prefixof @# =
> endgroup gobbled true @# gobble begingroup
> enddef;
> vardef prefixof x@# =
> endgroup gobbled true suffixof #@.@ gobble begingroup
> enddef;
>
> so that
>
> prefixof x.a := 0;
>
> would set x=0 (I know that I can use 'str', but I would like to know if
> this is possible without it).
>
> Thanks,
> Nicola
>
> --
> http://tug.org/metapost/
Ok, I've found a solution by myself. The problem is that
begingroup endgroup gobbled true
expands into an (empty) secondary. So, I cannot see any way in which a
vardef macro name can (directly) appear as a lhs of an assignment.
Therefore, my solution introduces a def:
vardef suffixof prefixof @# =
endgroup @# gobble begingroup
enddef;
vardef prefixof x@# =
endgroup gobble suffixof #@.@ gobble begingroup
enddef;
def assignprefix suffix s = gobble prefixof s enddef;
So, now
assignprefix x.a := 0;
indeed works and it sets x=0 (and so does assignprefix x.a[1].c := 0, or
whatever).
Well, for me it was a funny challenge.
Nicola
More information about the metapost
mailing list