Оценка прямых функций APL
Вот фрагмент, который я недавно тестировал. Требуется два диаметра (⍺,⍵
) и вычисляет окружность круга:
10{(○1×⍺){⍺ ⍵}○1×⍵}10 ⍝ note the brackets around ⍺
31.4159 31.4159
10{○1×⍺{⍺ ⍵}○1×⍵}10
31.4159 98.696
Я хотел бы понять, как работает оценка этого выражения - почему первое оценивает правильно, а второе - нет?
Я использую Dyalog APL.
1 ответ
У вас есть вложенные функции. В обоих случаях внутренняя функция просто возвращает свой правый и левый аргументы. В первом случае левый аргумент внутренней функции - это выражение (○ 1×⍺), во втором случае левый аргумент внутренней функции - просто simply, или неизмененный левый аргумент внешней функции - тогда весь Результат внутренней функции умножается на ○ и на 1.
Обратите внимание, что аргумент функции circle - это все справа, поэтому 1 x полностью избыточен.
В APL выражения оцениваются справа налево. Можно сказать, что функция относится ко всему справа, если она не изменена паренами. Поэтому мы могли бы сказать, что в первом выражении ○ принимает 1, умноженное на все справа от него, что только ⍺ из-за скобок. Но во втором выражении ○ принимает 1, умноженное на все справа от него, что является результатом внутренней функции.
Кроме того, обратите внимание, что благодаря скалярному расширению вы можете вычислить два числа без скобок:
○10 10
31.415926535898 31.415926535898
Дальше интереснее с разными диаметрами:
○10 15 20
31.415926535898 47.123889803847 62.831853071796