Согласно документации для ⎕SIGNAL
(мой акцент):
Индикатор состояния сокращен для выхода из функции или оператор, содержащий строку, которая вызвала ⎕SIGNAL
, или обрезается для выхода из выражения Execute (⍎
), которое вызвало ⎕SIGNAL
.Если выполняется внутри вложенного dfn, индикатор состояния обрезается для выхода из капсулы, содержащей строку, которая вызвала ⎕SIGNAL
.Затем генерируется ошибка.
Другими словами, к тому времени, когда ⎕SIGNAL
завершает свою работу, мы уже вне dfn и, таким образом, защита от ошибок dfn (::
)больше не действует.
Чтобы обойти это, вы должны использовать ⎕SIGNAL
в отдельной капсуле.Например, вы можете определить функцию покрытия вне функции, в которой вы хотите ее использовать:
Signal←{⎕SIGNAL ⍵}
{11::¯1 ⋄ Signal 11}⍬
¯1
В качестве альтернативы, вы можете поместить ⎕SIGNAL
в свою собственную капсулу выполнения:
{11::¯1 ⋄ ⍎'⎕SIGNAL 11'}⍬
¯1