list ← list ##.alpush key val ⍝ List ⍺ extended with key-value pair ⍵
val list ← list ##.alpop key ⍝ Value for key ⍵, and reduced list ⍺
val ← list ##.alget key ⍝ Value for key ⍵ from list ⍺
list ← list ##.alset key val ⍝ List ⍺ with key-value ⍵ replacement
An association list (AKA: dictionary, symbol table, look-up table) is a classic
and generally useful structure. It is implemented here as a pair of vectors of
keys and values. Each item of the keys vector would typically be a character
vector but it could be any array.
An example might be a list of things people found on the beach:
⊢ found ← ('milly' 'molly' 'may') ('star' 'thing' 'stone') ⍝ keys values
┌─────────────────┬──────────────────┐
│┌─────┬─────┬───┐│┌────┬─────┬─────┐│
││milly│molly│may│││star│thing│stone││
│└─────┴─────┴───┘│└────┴─────┴─────┘│
└─────────────────┴──────────────────┘
found alget 'may' ⍝ what did may find?
stone
[alpush] and [alpop] prefix and remove keys from the list:
⊢ found ← found alpush 'maggie' 'shell' ⍝ maggie discovered a shell
┌────────────────────────┬────────────────────────┐
│┌──────┬─────┬─────┬───┐│┌─────┬────┬─────┬─────┐│
││maggie│milly│molly│may│││shell│star│thing│stone││
│└──────┴─────┴─────┴───┘│└─────┴────┴─────┴─────┘│
└────────────────────────┴────────────────────────┘
⎕ found ← found alpop 'molly' ⍝ Pop molly and her finding
thing
found
┌──────────────────┬──────────────────┐
│┌──────┬─────┬───┐│┌─────┬────┬─────┐│
││maggie│milly│may│││shell│star│stone││
│└──────┴─────┴───┘│└─────┴────┴─────┘│
└──────────────────┴──────────────────┘
[alget] and [alset] access and replace list items:
found alget 'may' ⍝ may's finding
stone
⊢ found ← found alset 'may' 'pebble' ⍝ swap may's stone for a pebble
┌──────────────────┬───────────────────┐
│┌──────┬─────┬───┐│┌─────┬────┬──────┐│
││maggie│milly│may│││shell│star│pebble││
│└──────┴─────┴───┘│└─────┴────┴──────┘│
└──────────────────┴───────────────────┘
found alget 'may' ⍝ ... and check
pebble
Shadowing
---------
[alpush] _prefixes_ a new value to the list. This means that a new association
"shadows" an existing one of the same key as far as subsequent calls to [alget]
are concerned. [alpop] removes the last-pushed pairing, thus "unshadowing" it.
found ⍝ association list
┌──────────────────┬───────────────────┐
│┌──────┬─────┬───┐│┌─────┬────┬──────┐│
││maggie│milly│may│││shell│star│pebble││
│└──────┴─────┴───┘│└─────┴────┴──────┘│
└──────────────────┴───────────────────┘
⊢ found ← found alpush 'may' 'rock' ⍝ may's rock shadows her pebble
┌──────────────────────┬────────────────────────┐
│┌───┬──────┬─────┬───┐│┌────┬─────┬────┬──────┐│
││may│maggie│milly│may│││rock│shell│star│pebble││
│└───┴──────┴─────┴───┘│└────┴─────┴────┴──────┘│
└──────────────────────┴────────────────────────┘
found alget 'may' ⍝ may's latest find
rock
⎕ found ← found alpop 'may' ⍝ unshadowing may
rock
found alget 'may' ⍝ previous value revealed
pebble
Technical notes:
[alget] is coded:
alget←{keys vals←⍺ ⋄ (keys⍳⊂⍵)⊃vals}
If the sought key is not in the list, the code generates INDEX ERROR. It is easy
to tweak the function to return a special "not found" value instead:
alget←{keys vals←⍺ ⋄ (keys⍳⊂⍵)⊃vals,⊂'Eh?'}
¯¯¯¯¯¯¯
Similar changes would allow [alset] and [alpop] to be equally permissive.
Examples:
list←('milly' 'molly' 'may')('star' 'thing' 'stone')
list alget 'may' ⍝ associated with may:
stone
⊢ list ← list alpush 'maggie' 'shell' ⍝ prefix maggie and her shell
┌────────────────────────┬────────────────────────┐
│┌──────┬─────┬─────┬───┐│┌─────┬────┬─────┬─────┐│
││maggie│milly│molly│may│││shell│star│thing│stone││
│└──────┴─────┴─────┴───┘│└─────┴────┴─────┴─────┘│
└────────────────────────┴────────────────────────┘
⊢ item list ← list alpop 'molly' ⍝ without molly and her thing
┌─────┬───────────────────────────────────────┐
│thing│┌──────────────────┬──────────────────┐│
│ ││┌──────┬─────┬───┐│┌─────┬────┬─────┐││
│ │││maggie│milly│may│││shell│star│stone│││
│ ││└──────┴─────┴───┘│└─────┴────┴─────┘││
│ │└──────────────────┴──────────────────┘│
└─────┴───────────────────────────────────────┘
⊢ list ← list alset 'may' 'pebble' ⍝ may's stone replaced
┌──────────────────┬───────────────────┐
│┌──────┬─────┬───┐│┌─────┬────┬──────┐│
││maggie│milly│may│││shell│star│pebble││
│└──────┴─────┴───┘│└─────┴────┴──────┘│
└──────────────────┴───────────────────┘
See also: Graphs list key foldl
Back to: contents
Back to: Workspaces