评估APL直接功能

syn*_*gma 2 evaluation apl operator-precedence dyalog

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

10{(?1×?){? ?}?1×?}10 ? note the brackets around ?
  31.4159 31.4159
10{?1×?{? ?}?1×?}10
  31.4159 98.696
Run Code Online (Sandbox Code Playgroud)

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

我正在使用Dyalog APL.

Pau*_*our 5

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

请注意,circle函数的参数是其右侧的所有内容,因此1 x完全是冗余的.

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

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

      ?10 10
31.415926535898 31.415926535898
Run Code Online (Sandbox Code Playgroud)

更有趣的是不同的直径:

     ?10 15 20
31.415926535898 47.123889803847 62.831853071796
Run Code Online (Sandbox Code Playgroud)