如何在断言失败时使非交互式Maple退出?

时间:2014-12-04 15:57:18

标签: assert exit-code maple

我的t.ms文件包含:

interface(prettyprint=0): kernelopts(assertlevel=1):
ASSERT(1<1):
ASSERT(2<2):

当我跑步时:

maple -q t.ms; echo $?

我明白了:

Error, assertion failed
Error, assertion failed
0

当我跑步时:

maple -e 2 -q t.ms; echo $?

我明白了:

Error, assertion failed
0

我想得到:

Error, assertion failed
4

也就是说,我希望Maple在第一次失败的断言时以非零退出状态退出。 (如果退出代码为1或其他任何内容,我都不在乎,只要它非零。我已经从documentation得到了与错误相关的数字4 )我该怎么做?

1 个答案:

答案 0 :(得分:2)

文档没有说明必须使用,

`quit`(n)

使用名称引用。

interface(prettyprint=0):

handler:=proc(e::uneval)
  local failed;
  printf("entered\n"); # remove this when satisfied
  failed:=false;
  try
    if evalb(eval(e)) <> true then
      error;
    end if;;
  catch:
    failed:=true;
    printf("Error, assertion failed\n");
  finally;
    if failed then
       `quit`(5);
    end if;
  end try;
  true;
end proc:

ASSERT( handler( 1<1 )):
ASSERT( handler( 2<2 )):

现在,将其保存为文件uh.mpl,然后使用Maple 18.01 for Linux,我看到了,

$ maple18.01 -q -A 2 ~/uh.mpl ; echo $?
entered
Error, assertion failed
5

如果在没有-A 2的情况下运行,那么它就不会运行断言的检查。

[编辑]以下是一个小小的修改,以便在打印过程中处理其他参数。

handler:=proc(e::uneval)
  local failed;
  printf("entered\n"); # remove this when satisfied
  failed:=false;
  try
    if evalb(eval(e)) <> true then
      error;
    end if;;
  catch:
  failed:=true;
  printf("Error, assertion failed, %q\n", _rest);
  finally;
  if failed then
     `quit`(5);
  end if;
  end try;
  true;
end proc: