From APL Wiki
Jump to navigation Jump to search
"dfns" redirects here. For the workspace by Scholes, see dfns workspace.

A dfn (contraction of direct function or dynamic function, pronounced "dee fun") is an alternative way to define a function and operator, invented by John Scholes. A dfn operator can also be called a dop (pronounced "dee op").

John Scholes was responsible for numerous presentations and publications on and about dfns, and until his passing he maintained the dfns workspace, a collection of dfns examples.

As of 2020, dfns are fully implemented in Dyalog APL, NARS2000, ngn/apl, dzaima/APL, and partially in GNU APL, although not all dialects implement lexical scoping, in contrast to the dynamic scoping of tradfns. In other words, a dfn cannot "see" locals of its caller, but can see locals of its definer.

Wikipedia includes a thorough treatment of dfns.



      {*0.5} 16        ⍝ square root
      3 {} 27       ⍝ ⍺th root

Default left arguments

Assignment to is unusual in that the entire statement is only executed if the dfn is called monadically:[1]

          2           ⍝ square root by default
                    ⍝ result


Guards provide dfns with support for basic flow control.[2] This is a multiline dfn with a conditional result:

          =0:0         ⍝ return zero if zeroth root
                    ⍝ result


Dyalog APL dfns support error-guards for processing errors by error codes.[3]

In the following example, there are two error-guards for the error code 11 (DOMAIN ERROR):[4]

    G6.6743E¯11       ⍝ gravitational constant
    11::'N/A'          ⍝ second DOMAIN ERROR: return 'N/A'
    11::∇¨           ⍝ first DOMAIN ERROR: maybe the argument is a vector of strings?
    G×[1]×[2]÷[3]*2 ⍝ the argument is a vector of numbers

      ⍝ Calculate gravity force between the Earth and the Sun
      Gravity '1.99e30' '5.97e24' '1.50e11'
      Gravity 1.99e30 5.97e24 1.50e11
      Gravity 1.99e30 5.97e24 0   ⍝ trigger division by zero

Shy results

Roger Hui's assert is a dfn that has become the de facto standard when it comes to test suites.[5]. In it, Hui uses both a default left argument and a final assignment to make the dfn shy:

assert  {'assertion failure'  0⍵:⍺ ⎕signal 8  shy0}

External links