aboutsummaryrefslogtreecommitdiff

Container Types

Apart from arrays and scopes, a few other container types are provided in the standard library.

Lists

A list maps integers to arbitrary objects. Access to members takes time linear in the index.

A new list can be created with list and appended to with append or append1 (the latter will not distribute over domain having inputs).

list ==l
/a l .append
/b l .append
/c l .append
l dump
<scope: 0000600000533210>
l |dump each
"a"
"b"
"c"
l len dump
0000000000000003
list ==m
[ /a /b /c ] m .append1
m len dump
0000000000000001

Lists can be used similar to functions from integers or arrays. Just as with arrays, negative indices start from the end of the list towards the beginning. Write access is provided via =[] as usual.

list ==l
[ /a /b /c ] l .append
0 l * dump
"a"
1 neg l * dump
"c"
l dom dump
[
  0000000000000000
  0000000000000001
  0000000000000002
]
/foo 1 l =[]
l |dump each
"a"
"foo"
"c"
l l { cat } '*0.0 |dump each
"aa"
"bb"
"cc"

List can be used like a stack via pop.

list ==l
[ /a /b /c ] l .append
l .pop
l |dump each
"a"
"b"

Maps

Maps wrap scopes to provide an array-like container mapping from strings to arbitrary objects.

A new map can be created with map, new members are added via =[] when the key does not exist beforehand. Access to specific members works like in arrays via *. Testing for members can be done via has.

map ==m
1 /foo m =[]
2 /bar m =[]
m dump
<scope: 0000600000533210>
m dom dump
[
  "foo"
  "bar"
]
m |dump each
0000000000000001
0000000000000002
/foo m * dump
0000000000000001
/foo m .has dump
0000000000000001
/FOO m .has dump
0000000000000000
m 2 mul ==m2
m2 dom dump
[
  "foo"
  "bar"
]
m2 |dump each
0000000000000002
0000000000000004
/foo m2 * dump
0000000000000002

Trees

Trees provide mapping from keys to arbitrary objects, keeping the keys in lt/eq/gt ascending order. Otherwise they should work just as maps.

tree ==t
1 /foo t =[]
2 /bar t =[]
t dump
<scope: 0000600000533210>
t dom dump
[
  "bar"
  "foo"
]
t |dump each
0000000000000002
0000000000000001
/foo t * dump
0000000000000001
/foo t .has dump
0000000000000001
/FOO t .has dump
0000000000000000
t 2 mul ==t2
t2 dom dump
[
  "bar"
  "foo"
]
t2 |dump each
0000000000000004
0000000000000002
/foo t2 * dump
0000000000000002