2014-12-04 2 views
0

Мой t.ms файл содержит:Как сделать неинтерактивный выход Maple при ошибке утверждения?

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 

То есть, я хочу, чтобы выйти из клена с ненулевым статусом выхода после первого провала попытки утверждения. (Мне все равно, если код выхода 1 или что-то еще, если оно отличное от нуля. У меня есть номер 4 из documentation, связанный с errorbreak) Как это получить?

+0

Код выхода из '1' означает, что клен не смог инициализировать/запустить. Почему вы хотите использовать это? Коды выхода должны сообщать ОС, чтобы определить, почему * клен закрыт. В вашем примере клен работает и закрывается правильно. [Похоже, вы можете вернуть свои собственные с помощью 'quit (n)', 'done (n)' или 'stop (n)', хотя.] (Http://www.maplesoft.com/support/help/maple /view.aspx?path=maple) – admdrew

+1

Вы можете получить клен для выхода из первой неперехваченной ошибки (вызванной в этом случае первым неудавшимся утверждением) с помощью параметра '-e 2'. – acer

+0

@acer: Спасибо за '-e 2'. Это действительно вызывает ранний выход, но с кодом выхода 0. Я обновил свой вопрос, чтобы это отразить. Как получить ранний выход с ненулевым кодом выхода? – pts

ответ

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 для Linux я вижу,

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

И если работать без -A 2 то не запускалась заявленные чеки.

[edit] Ниже приведена небольшая модификация для обработки дополнительных аргументов как часть печати.

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: 
+0

Удивительный, спасибо! Можете ли вы добавить дополнительные аргументы в 'handler' для отображения пользовательского сообщения об ошибке, похожее на то, что отображает' ASSERT (1 <1, (2, 3, [4, 5], "foo")) ''? – pts

+0

Я сделал ревизию для дополнительных аргументов. – acer