为什么我不能使用像a1
、str2
、这样的变量名x12
?Metapost 会将它们视为数组吗?这样就a1
等于 等等吗?甚至像、等这样a[1]
的 z 符号也不起作用。z1
z2
代码如下
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
、、z2
等z3
作为成对没有任何显式声明。因此,正如 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)
,其中x1
和y1
是普通numeric
变量。
这是因为 MP 允许你将numeric
变量等同为文字对,如下所示
(a, b) = (3, 4)
正如您所发现的,您不必声明numeric
变量。