奇怪的Metapost括号错误

时间:2013-10-14 20:11:30

标签: metapost

编译以下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.(第一个引号应该是反引号,但我无法弄清楚如何逃避它)。究竟哪里有一个不匹配的括号?

感谢您的帮助!

1 个答案:

答案 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