Assignment: Difference between revisions

Jump to navigation Jump to search
Function assignment section, with references from HOPL4
(added examples and explanation to index assignments)
 
(Function assignment section, with references from HOPL4)
 
(7 intermediate revisions by 3 users not shown)
Line 1: Line 1:
You can assign a value to a variable with the glyph: '←'.
{{Built-in|Assignment|←}} allows associating a name with an [[array]] value. Some dialects also allow assignment of function and operator values using the assignment arrow. In [[defined function]]s, assignment is global by default, but can be made local through explicit mention of the target name in the function header, or through dynamic [[shadow]]ing using <syntaxhighlight lang=apl inline>⎕SHADOW</syntaxhighlight>. In [[dfn]]s, assignments are local by default, but can be made global by explicit mention of the target namespace. Modified/indexed/selective assignment updates the most local definition.
 
==Examples==
Common examples (boxing on, and ⎕io is 0):
===Basic usage===
    mat←(1 2 3)(1 2 3)
Common examples (boxing on, and [[index origin]] is 0):
    mat
<syntaxhighlight lang=apl>
      ⎕←mat←(1 2 3)(1 2 3)
┌─────┬─────┐
┌─────┬─────┐
│1 2 3│1 2 3│
│1 2 3│1 2 3│
└─────┴─────┘
└─────┴─────┘
    mat[0]←1 ⍝ indexed assignment
</syntaxhighlight>
    mat
===Indexed assignment===
Individual elements can be updated using index assignment:
<syntaxhighlight lang=apl>
      mat[0]←1
      mat
┌─┬─────┐
┌─┬─────┐
│1│1 2 3│
│1│1 2 3│
└─┴─────┘
└─┴─────┘
    mat←3 3⍴⍳9
</syntaxhighlight>
    mat
A semicolon is necessary when dealing with a [[matrix]]:
<syntaxhighlight lang=apl>
      mat←3 3⍴⍳9
      mat
0 1 2
0 1 2
3 4 5
3 4 5
6 7 8
6 7 8
    mat[0 1;] ⍝ 1 semicolon is necessary when dealing with 2D arrays, 2 semicolons for 3D arrays etc.
      mat[0 1;]
0 1 2
0 1 2
3 4 5
3 4 5
    mat[0 1;0 1]←0
      mat[0 1;0 1]←0
    mat
      mat
0 0 2
0 0 2
0 0 5
0 0 5
6 7 8
6 7 8
    ⍝ incrementing (or any dyadic function) parts of an array
</syntaxhighlight>
    mat←3 3⍴0
For higher-[[rank]] arrays, the number of semicolons needed is one less than the array rank.
    mat
===Modified assignment===
Some dialects allow placing a function the the immediate left of the assignment arrow:
<syntaxhighlight lang=apl>
      var←42
      var+←1
      var
43
</syntaxhighlight>
<syntaxhighlight lang=apl inline>var+←1</syntaxhighlight> is essentially equivalent to <syntaxhighlight lang=apl inline>1⊣var←var+1</syntaxhighlight> except that the result is [[shy]].
===Modified indexed assignment===
Modified assignment can also be combined with indexed assignment:
<syntaxhighlight lang=apl>
      mat←3 3⍴0
      mat
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
    mat[0 1;1]+←1
      mat[0 1;1]+←1
    mat
      mat
0 1 0
0 1 0
0 1 0
0 1 0
0 0 0
0 0 0
    mat[1;1],←'x'
      mat[1;1],←'x'
    mat
      mat
0 1 0
0 1 0
0 x 0
0 x 0
0 0 0
0 0 0
</syntaxhighlight>
== Function assignment ==
In modern dialects, the right hand side of assignment may be a [[function]] (or possibly an [[operator]]). This allows [[Anonymous function|anonymous]] and [[tacit]] functions to be named.
<syntaxhighlight lang=apl>
      sum←+/
      sum ⍳10
55
</syntaxhighlight>
Before the 1980s, only arrays could be assigned: [[defined function]]s included the function name in the header in order to associate it with the function, and [[derived function]]s could not be named directly. Instead the programmer would define a function that explicitly called that derived function on its arguments. [[Iverson]]'s 1978 paper [[Operators and Functions]] used a new [[glyph]], an assignment arrow with a bar above (that is, [[overstruck]] with a [[high minus]]), as [[Adin Falkoff]] objected to the use of the unmodified assignment arrow.<ref>[[Roger Hui]] and [[Morten Kromberg]]. [https://dl.acm.org/doi/abs/10.1145/3386319 ''APL since 1978'']. ACM HOPL IV. 2020-06.</ref> However, Iverson used the assignment arrow directly in several papers he co-authored beginning in 1980.<ref>[[Bob Bernecky]] and [[Ken Iverson]]. [https://www.jsoftware.com/papers/opea.htm Operators and Enclosed Arrays] at [[IPSA '80]]</ref><ref>[[Ken Iverson]] and Peter Wooster. [https://dl.acm.org/doi/abs/10.1145/390007.805349 A function definition operator] at [[APL81]].</ref><ref>[[Ken Iverson]] and [[Arthur Whitney]]. [https://doi.org/10.1145/800071.802236 "Practical uses of a model of APL"] ([https://www.jsoftware.com/papers/APLModel.htm web]) at [[APL82]].</ref> Function assignment was added to [[Dyalog APL]] in version 4.0 in 1986. It was a key feature of [[J]], which supports only anonymous and tacit functions.
== External Links ==
=== Documentation ===
* [https://help.dyalog.com/latest/index.htm#Language/Primitive%20Functions/Assignment.htm Dyalog]
* [https://microapl.com/apl_help/ch_020_010_110.htm APLX]
* J: [https://code.jsoftware.com/wiki/Vocabulary/eqdot local], [https://code.jsoftware.com/wiki/Vocabulary/eqco global]
== References ==
<references/>
{{APL built-ins}}[[Category:Primitive functions]]

Navigation menu