评估APL直接功能

时间:2014-06-08 10:07:39

标签: evaluation operator-precedence apl dyalog

这是我最近测试的一个片段。它需要两个直径(⍺,⍵)并计算圆的周长:

10{(○1×⍺){⍺ ⍵}○1×⍵}10 ⍝ note the brackets around ⍺
  31.4159 31.4159
10{○1×⍺{⍺ ⍵}○1×⍵}10
  31.4159 98.696

我想了解这个表达式的评估是如何工作的 - 为什么第一个正确评估,第二个不是?

我正在使用Dyalog APL。

1 个答案:

答案 0 :(得分:5)

你有嵌套的功能。在这两种情况下,内部函数只返回其左右参数。在第一种情况下,内部函数的左参数是表达式(○1×⍺),在第二种情况下,内部函数的左参数只是⍺,或者外部函数的未改变的左参数 - 然后是整个内部函数的结果乘以○和1。

请注意,circle函数的参数是右边的所有内容,因此1 x完全是多余的。

在APL中,表达式从右到左进行评估。我们可以说,除非由parens修改,否则函数适用于其右边的所有内容。因此我们可以说在第一个表达式中,○取1乘以右边的所有东西,因为括号只有⍺。但是在第二个表达式中,○取1乘以右边的内容,这是内部函数的结果。

此外,请注意,由于标量扩展,您可以计算两个没有大括号的数字:

      ○10 10
31.415926535898 31.415926535898

不同直径更有趣:

     ○10 15 20
31.415926535898 47.123889803847 62.831853071796