Assignment

From APL Wiki
Revision as of 21:32, 9 March 2024 by Marshall (talk | contribs) (Function assignment section, with references from HOPL4)
Jump to navigation Jump to search

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 functions, assignment is global by default, but can be made local through explicit mention of the target name in the function header, or through dynamic shadowing using ⎕SHADOW. In dfns, 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

Basic usage

Common examples (boxing on, and index origin is 0):

      ⎕←mat←(1 2 3)(1 2 3)
┌─────┬─────┐
│1 2 3│1 2 3│
└─────┴─────┘

Indexed assignment

Individual elements can be updated using index assignment:

      mat[0]←1
      mat
┌─┬─────┐
│1│1 2 3│
└─┴─────┘

A semicolon is necessary when dealing with a matrix:

      mat←3 3⍴⍳9
      mat
0 1 2
3 4 5
6 7 8
      mat[0 1;]
0 1 2
3 4 5
      mat[0 1;0 1]←0
      mat
0 0 2
0 0 5
6 7 8

For higher-rank arrays, the number of semicolons needed is one less than the array rank.

Modified assignment

Some dialects allow placing a function the the immediate left of the assignment arrow:

      var←42
      var+←1
      var
43

var+←1 is essentially equivalent to 1⊣var←var+1 except that the result is shy.

Modified indexed assignment

Modified assignment can also be combined with indexed assignment:

      mat←3 3⍴0
      mat
0 0 0
0 0 0
0 0 0
      mat[0 1;1]+←1
      mat
0 1 0
0 1 0
0 0 0
      mat[1;1],←'x'
      mat
0 1 0
0 x 0
0 0 0

Function assignment

In modern dialects, the right hand side of assignment may be a function (or possibly an operator). This allows anonymous and tacit functions to be named.

      sum←+/
      sum ⍳10
55

Before the 1980s, only arrays could be assigned: defined functions included the function name in the header in order to associate it with the function, and derived functions 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.[1] However, Iverson used the assignment arrow directly in several papers he co-authored beginning in 1980.[2][3][4] 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

References

APL built-ins [edit]
Primitives (Timeline) Functions
Scalar
Monadic ConjugateNegateSignumReciprocalMagnitudeExponentialNatural LogarithmFloorCeilingFactorialNotPi TimesRollTypeImaginarySquare RootRound
Dyadic AddSubtractTimesDivideResiduePowerLogarithmMinimumMaximumBinomialComparison functionsBoolean functions (And, Or, Nand, Nor) ∙ GCDLCMCircularComplexRoot
Non-Scalar
Structural ShapeReshapeTallyDepthRavelEnlistTableCatenateReverseRotateTransposeRazeMixSplitEncloseNestCut (K)PairLinkPartitioned EnclosePartition
Selection FirstPickTakeDropUniqueIdentityStopSelectReplicateExpandSet functions (IntersectionUnionWithout) ∙ Bracket indexingIndexCartesian ProductSort
Selector Index generatorGradeIndex OfInterval IndexIndicesDealPrefix and suffix vectors
Computational MatchNot MatchMembershipFindNub SieveEncodeDecodeMatrix InverseMatrix DivideFormatExecuteMaterialiseRange
Operators Monadic EachCommuteConstantReplicateExpandReduceWindowed ReduceScanOuter ProductKeyI-BeamSpawnFunction axisIdentity (Null, Ident)
Dyadic BindCompositions (Compose, Reverse Compose, Beside, Withe, Atop, Over) ∙ Inner ProductDeterminantPowerAtUnderRankDepthVariantStencilCutDirect definition (operator)Identity (Lev, Dex)
Quad names Index originComparison toleranceMigration levelAtomic vector