Arrays of Namespace References
You can construct arrays of refs using strand notation, array notation, catenate (,
), reshape (⍴
) and other structural primitives, as well as certain system functions.
EMP←JOHN PAUL
⍴EMP
2
EMP
#.[Namespace] #.[Namespace]
Like any other array, an array of refs has name class 2:
⎕NC 'EMP'
2
Expressions such as indexing and pick return refs that may in turn be used as follows:
EMP[1].FirstName
John
(2⊃EMP).Age
44
The each (¨
) operator may be used to apply a function to an array of refs:
SHOW¨EMP
John Smith is 50 Paul Brown is 44
An array of namespace references (refs) to the left of a '.
' is expanded according to the following rule, where x
and y
are refs, and exp
is an arbitrary expression:
(x y).exp → (x.exp)(y.exp)
If exp
evaluates to a function, the items of its argument array(s) are distributed to each referenced function. In the dyadic case, there is a 3-way distribution among: left argument, referenced functions and right argument.
Monadic function f
:
(x y).f d e → (x.f d)(y.f e)
Dyadic function g
:
a b (x y).g d e → (a x.g d)(b y.g e)
An array of refs to the left of an assignment arrow is expanded thus:
(x y).a←c d → (x.a←c)(y.a←d)
Note that the array of refs can be of any rank. In the limiting case of a simple scalar array, the array construct: refs.exp
is identical to the scalar construct: ref.exp
.
Note that the expression to the right of the '.
' pervades a nested array of refs to its left:
((u v)(x y)).exp → ((u.exp)(v.exp))((x.exp)(y.exp))
Note also that with successive expansions (u v).(x y z).
..., the final number of "leaf" terms is the product of the number of refs at each level.
Examples
(JOHN PAUL)←()()
JOHN.Children←()()
⍴JOHN.Children
2
JOHN.Children[1].FirstName←'Andy'
JOHN.Children[1].Age←23
JOHN.Children[2].FirstName←'Katherine'
JOHN.Children[2].Age←19
PAUL.Children←()()
PAUL.Children[1].(FirstName Age←'Tom' 25)
PAUL.Children[2].(FirstName Age←'Jamie' 22)
EMP←JOHN PAUL
⍴EMP
2
(⊃EMP).Children.(FirstName Age)
Andy 23 Katherine 19
]display (2⊃EMP).Children.(FirstName Age)
┌→────────────────────────────┐
│ ┌→─────────┐ ┌→───────────┐ │
│ │ ┌→──┐ │ │ ┌→────┐ │ │
│ │ │Tom│ 25 │ │ │Jamie│ 22 │ │
│ │ └───┘ │ │ └─────┘ │ │
│ └∊─────────┘ └∊───────────┘ │
└∊────────────────────────────┘
EMP.Children ⍝ Is an array of refs
#.[Namespace] #.[Namespace] #.[Namespace] ...
EMP.Children.(FirstName Age)
Andy 23 Katherine 19 Tom 25 Jamie 22