Оценка прямых функций 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
Другие вопросы по тегам