2

当我编译以下 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.第一个引号应该是反引号,但我不知道如何转义它)。到底哪里有不匹配的括号?

谢谢你的帮助!

4

1 回答 1

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.

于 2014-03-28T08:42:33.710 回答