Metapost:变量名称末尾带有数字

Metapost:变量名称末尾带有数字

为什么我不能使用像a1str2、这样的变量名x12?Metapost 会将它们视为数组吗?这样就a1等于 等等吗?甚至像、等这样a[1]的 z 符号也不起作用。z1z2

代码如下

beginfig(1);
# := 5mm;
pair z1, z2, z3, z4;
z1 = (10#, #);
z2 = (#, 12#);
z3 = origin;
z4 = (11#, 13#);
draw z1--z2;
draw z3--z4;
endfig;
end;
bye.

错误如下:

! Illegal suffix of declared variable will be flushed.
<to be read again>
                   1
l.153 pair z1
             , z2, z3, z4;
?

答案1

这里有几点。

首先,你不能在变量声明中添加后缀。相反,你必须集体声明它们。因此,这样做是可行的:

prologues := 3;
outputtemplate := "%j%c.eps";
beginfig(1);
# := 5mm;
pair p[];
p1 = (10#, #);
p2 = (#, 12#);
p3 = origin;
p4 = (11#, 13#);
draw p1--p2;
draw p3--p4;
endfig;
end

z[]其次,由于特殊情况,您不能使用普通 MP 进行变量声明。如果您尝试这样做:

prologues := 3;
outputtemplate := "%j%c.eps";
beginfig(1);
# := 5mm;
pair z[];
z1 = (10#, #);
z2 = (#, 12#);
z3 = origin;
z4 = (11#, 13#);
draw z1--z2;
draw z3--z4;
endfig;
end

你会收到这个错误

! Declared variable conflicts with previous vardef.
<to be read again> 
                   ;
l.5 pair z[];

因为plain.mp定义了一个巧妙的宏,叫做,z它允许你使用z1、、z2z3作为成对没有任何显式声明。因此,正如 OP 发现的那样,这也有效:

prologues := 3;
outputtemplate := "%j%c.eps";
beginfig(1);
# := 5mm;
z1 = (10#, #);
z2 = (#, 12#);
z3 = origin;
z4 = (11#, 13#);
draw z1--z2;
draw z3--z4;
endfig;
end

巧妙vardef之处plain.mp在于:

vardef z@#=(x@#,y@#) enddef;

有了这个定义,z1会自动扩展为文字标记(x1, y1),其中x1y1是普通numeric变量。

这是因为 MP 允许你将numeric变量等同为文字对,如下所示

(a, b) = (3, 4)

正如您所发现的,您不必声明numeric变量。

相关内容