Difference between revisions of "Dfn"

From APL Wiki
Jump to navigation Jump to search
 
(9 intermediate revisions by 4 users not shown)
Line 1: Line 1:
 
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").
 
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 [https://dfns.dyalog.com dfns website].
+
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 [[wikipedia:lexical scoping|lexical scoping]], in contrast to the dynamic scoping of [[tradfn]]s. In other words, a dfn cannot "see" locals of its caller, but can see locals of its definer.
 
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 [[wikipedia:lexical scoping|lexical scoping]], in contrast to the dynamic scoping of [[tradfn]]s. In other words, a dfn cannot "see" locals of its caller, but can see locals of its definer.
  
 
Wikipedia includes a thorough treatment of [[Wikipedia:dfns|dfns]].
 
Wikipedia includes a thorough treatment of [[Wikipedia:dfns|dfns]].
 +
 +
== Examples ==
 +
<source lang=apl>
 +
      {⍵*0.5} 16        ⍝ square root
 +
4
 +
      3 {⍵*÷⍺} 27      ⍝ ⍺th root
 +
3
 +
      ⍝ Multiline dfn with optional left parameter and conditional result
 +
      root←{
 +
          ⍺←2          ⍝ square root by default
 +
          ⍺=0:0        ⍝ return zero if zeroth root
 +
          ⍵*÷⍺          ⍝ result
 +
      }</source>
 +
 +
=== Error-guards ===
 +
Dyalog APL dfns support error-guards for processing errors by error codes.<ref>[https://help.dyalog.com/latest/#Language/Defined%20Functions%20and%20Operators/DynamicFunctions/Error%20Guards.htm Error Guards] – Dyalog APL.</ref>
 +
 +
In the following example, there are two error-guards for the error code 11 (DOMAIN ERROR):<ref>[https://help.dyalog.com/latest/#Language/Errors/APL%20Errors.htm#APLErrors APL Error Messages and Codes] – Dyalog APL.</ref>
 +
<source lang=apl>
 +
Gravity←{
 +
    G←6.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'
 +
3.524119391E22
 +
      Gravity 1.99e30 5.97e24 1.50e11
 +
3.524119391E22
 +
      Gravity 1.99e30 5.97e24 0  ⍝ trigger division by zero
 +
N/A
 +
</source>
 +
 
== External links ==
 
== External links ==
 +
* [[wikipedia:Direct function|Direct function]]
 +
 
=== Tutorials ===
 
=== Tutorials ===
 
* APL Cultivation: [https://chat.stackexchange.com/rooms/52405/conversation/lesson-2-diving-into-functions-in-apl Diving Into Functions in APL]
 
* APL Cultivation: [https://chat.stackexchange.com/rooms/52405/conversation/lesson-2-diving-into-functions-in-apl Diving Into Functions in APL]
 +
* Mastering Dyalog: [https://www.dyalog.com/uploads/documents/MasteringDyalogAPL.pdf#page=174 page 174]
 +
 
=== Documentation ===
 
=== Documentation ===
* [http://help.dyalog.com/latest/#Language/Defined%20Functions%20and%20Operators/DynamicFunctions/Dynamic%20Functions%20and%20Operators.htm Dyalog]
+
* [https://help.dyalog.com/latest/#Language/Defined%20Functions%20and%20Operators/DynamicFunctions/Dynamic%20Functions%20and%20Operators.htm Dyalog]
 +
* [https://www.gnu.org/software/apl/apl.html#Section-3_002e7 GNU APL]
 +
 
 +
== References ==
 +
<references/>
 +
 
 +
{{APL syntax}}[[Category:Kinds of functions]][[Category:Defining functions]]

Latest revision as of 12:27, 2 November 2020

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.

Examples

      {*0.5} 16        ⍝ square root
4
      3 {} 27       ⍝ ⍺th root
3
      ⍝ Multiline dfn with optional left parameter and conditional result
      root{
          2           ⍝ square root by default
          =0:0         ⍝ return zero if zeroth root
                    ⍝ result
      }

Error-guards

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

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

Gravity{
    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'
3.524119391E22
      Gravity 1.99e30 5.97e24 1.50e11
3.524119391E22
      Gravity 1.99e30 5.97e24 0   ⍝ trigger division by zero
N/A

External links

Tutorials

Documentation

References

  1. Error Guards – Dyalog APL.
  2. APL Error Messages and Codes – Dyalog APL.


APL syntax [edit]
General Comparison with traditional mathematicsPrecedenceTacit programming
Array Numeric literalStringStrand notationObject literalArray notation
Function ArgumentFunction valenceDerived functionDerived operatorNiladic functionMonadic functionDyadic functionAmbivalent functionTradfnDfnFunction train
Operator OperandOperator valenceTradopDopDerived operator
Assignment MultipleIndexedSelectiveModified
Other Function axisBranchQuad nameSystem commandUser commandKeywordDot notationFunction-operator overloading