В Perl 6, как я могу напечатать тип исключений, возможно, во время компиляции? - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь решить эту проблему , в которой упоминается, что описание X::TypeCheck::Splice исключение в этой странице неверно . Это код:

use experimental :macros;
CATCH {
    # will definitely catch all the exception 
    default { say .^name, " → ", .Str; }
}

macro a { 'foo'  };
say a;

Который я расширил, включив в него блок CATCH. Однако возникает исключение:

===SORRY!===
Too few positionals passed; expected 3 arguments but got 2

Однако я не знаю, правильный ли это тип, поскольку он не перехватывается блоком CATCH. Я также пытался вставить этот блок в фазеры CHECK или BEGIN, которые появляются во время компиляции, но безрезультатно. Есть идеи?

Очевидно, что другие языки, такие как clojure, позволяют макросу обрабатывать свое собственное исключение . Это, кажется, не работает здесь; вставка блока CATCH внутри определения макроса выдает ПРЕДУПРЕЖДЕНИЕ и вид работ (будет выводить Nil), что, вероятно, означает, что он перехватывает исключение, но все еще не печатает тип исключения.

1 Ответ

0 голосов
/ 28 апреля 2018

запуск вашего кода через EVAL выдаст предупреждение во время компиляции во время выполнения eval sub

EVAL q/use experimental :macros; macro a { "foo" }; say a/;
CATCH { default { .perl.say } };
# X::AdHoc.new(payload => "Too few positionals passed; expected 3 arguments but got 2")

Как видите, по крайней мере в этой версии это исключение "нетипизированного". Они также могут поступать из виртуальной машины, где более детальная обработка ошибок не так проста, как в коде Perl 6 или NQP.

...