Если еще условия с APL?

Итак, я задаюсь вопросом / спрашиваю; Можно ли сделать If-Statement в APL? Если так, как?

Вот мой код

    'Please enter a number to count to: ' 
 number ←⎕ 
 ⍳number

Как получить оператор if, где, если пользователь введет число свыше 100, он выведет "слишком высоко" и завершит; или если это 100 или ниже, то это просто будет продолжаться?

Спасибо!

4 ответа

В Dyalog APL у вас есть эта аккуратная штука под названием охранники.

Они могут использоваться в dfns и оценивать код при совпадении определенного условия.

func ← {⍵>100 : 'too high' ⋄ 1 : 'number is ok'}

Если ваш APL поддерживает управляющие структуры, это должно работать:

∇ generateAll number
:If number>100
   ⎕←'Too high'
:else
   ⎕←⍳ number
:endif
∇

Если он НЕ поддерживает управляющие структуры (например, APL2), вам необходимо выполнить ветвление:

∇ generateAll number
 →(number>100)/error
 ⎕←⍳ number
 →0
error:
 ⎕←'Too high'
∇

Вы также можете использовать такие трюки, как execute, но это менее читабельно.

"Классический" способ обработки ошибок * в APL2 - это ⎕ES или ⎕EA. Ваш код будет выглядеть примерно так:

⎕ES(NUMBER>100)/'Too high'
⍳NUMBER

Здесь происходит то, что ЕСЛИ скобки оценивают как истинные, ТОГДА ⎕ES остановит выполнение и отобразит строку в кавычках.

Если вы не хотите, чтобы ваше ТО закончилось, посмотрите на ⎕EA в некоторой документации APL.

Обратите внимание, что я на APL2 в среде GreenOnBlack, так что, вероятно, есть более изящные способы сделать это на более современном диалекте, таком как Dyalog.


* Я знаю, что вы спрашиваете об условностях, а не об обработке ошибок, но так как ваш пример завершает выполнение, это также может быть обработка ошибок.

Между этим и тем, что предлагает MBaas, есть существенная разница: его решение будет корректно выходить из текущей функции, которая может возвращать значение. С помощью ⎕ES или же ⎕EA с прекратить все выполнение.

Зависит от используемого вами диалекта. Некоторые APL-реализации поддерживают структуры управления, поэтому вы можете написать что-то вроде

:If number>100
   ⎕←'Too high'
   →0
:endif
⍳number

В "традиционных APL" вы, вероятно, сделали бы что-то вроде

⍎(number>100)/'⎕←''Too high'' ⋄ →0'
⍳number
Другие вопросы по тегам