编译以下Metapost文件时:
beginfig(1);
def f(expr n) =
if n=0: 0
else: 1
fi;
enddef;
show f(0)+1;
endfig;
end
我希望得到输出1(因为f(0)等于0,f(0)+1应该是1!)。但是,Metapost抱怨Isolated expression.
当我将表达式放在括号中时:show (f(0)+1)
,事情变得更加奇怪。错误消息变为:Missing ')' has been inserted.
(第一个引号应该是反引号,但我无法弄清楚如何逃避它)。究竟哪里有一个不匹配的括号?
感谢您的帮助!
答案 0 :(得分:1)
def
命令只是将名称扩展为其定义,因此您可以按字面意思:
show if 0=0: 0 else: 1;+1;
中间的分号是错误的,所以让我们将其删除:
beginfig(1);
def f(expr n) =
if n=0: 0
else: 1
fi
enddef;
show f(0)+1;
endfig;
end
这会产生正确的扩展:
show if 0=0: 0 else: 1+1;
按预期输出1
。
另一方面,我建议使用begingroup ... endgroup用于较重的宏定义,至少使用括号用于较轻的宏定义:例如,
def f = 1 + 2 enddef;
show f * 2;
给出1 + 2 * 2
,这与可能的预期不同:
def f = (1 + 2) enddef;
show f * 2;
给出了(1 + 2) * 2
。