Nano Hash - криптовалюты, майнинг, программирование

Как сделать неинтерактивный выход 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 или чему-то еще, если он не равен нулю. У меня есть номер 4 из документация, относящаяся к устранению ошибок) Как мне это получить?

04.12.2014

  • Код выхода 1 означает, что maple не удалось инициализировать/запустить. Почему вы хотите использовать это? Коды выхода должны сообщать ОС, чтобы определить, почему закрылся Maple. В вашем примере клен работает и закрывается правильно. Похоже, вы можете вернуть свой собственный с помощью quit(n), done(n) или stop(n) , однако. 04.12.2014
  • Вы можете заставить maple выйти при первой необработанной ошибке (вызванной в данном случае первым неудачным утверждением), используя опцию -e 2. 04.12.2014
  • @acer: Спасибо за -e 2. Это действительно вызывает ранний выход, но с кодом выхода 0. Я обновил свой вопрос, чтобы отразить это. Как получить ранний выход с ненулевым кодом выхода? 04.12.2014
  • @admdrew: меня не волнует фактический код выхода, если он не равен нулю. Причина, по которой я хочу ненулевое значение, заключается в том, чтобы вызывающий процесс мог легко определить, успешно ли Maple выполнил команды от начала до конца (0 код выхода) или произошел какой-либо сбой (ненулевой код выхода), включая ошибку утверждения. 04.12.2014
  • @pts Понятно. К сожалению, кажется вероятным, что вам придется заставить quit(n) получить код, который вы хотите, поскольку ошибка утверждения не аналогична ошибке application. 04.12.2014
  • Противникам: что не так с этим вопросом? Это оффтоп? Непонятно, что мне нужно или сложно понять? Я хотел бы улучшить его, насколько это возможно, сделать его полезным как для себя, так и для сообщества, и сделать его легким (без особых усилий) для тех, кто знает ответ. 04.12.2014
  • @admdrew: Должен ли я тогда определить свою собственную функцию ASSERT, которая будет вызывать quit(4)? Как я могу это сделать? 04.12.2014
  • @pts Вам нужен ASSERT? Можете ли вы вместо этого try/catch указать свои условия и запустить quit(4) в случае неудачи? 04.12.2014

Ответы:


1

В документации не очень ясно, что нужно использовать,

`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, то он не запускает утвержденные проверки.

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

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:
04.12.2014
  • Потрясающе, спасибо! Не могли бы вы добавить дополнительные аргументы в handler, чтобы отображалось собственное сообщение об ошибке, подобное тому, что выводит ASSERT(1<1, (2, 3, [4, 5], "foo"))? 05.12.2014
  • Я сделал ревизию, для дополнительных аргументов. 05.12.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..