N-tuples and the Introduction of Null values in Kap
Kap has a datatype called a list
which is container that can hold 0 or more values. The list itself is a scalar (i.e. ⍴
on a list returns an empty array).
The origin of the idea of the n-tuple type comes from the APL bracket index syntax:
a ← 3 3 ⍴ ⍳9
a[2;1]
7
It all came out of the idea that I didn't want special syntax for the argument to an axis index operation, so I made 1;2;3;4
an object of its own. This is the n-tuple.
a ← 3 3 ⍴ ⍳9
b ← (2;1)
a[b]
Once the n-tuple existed, using this as a general way to pass multiple arguments to functions was a logical step:
∇ foo (a;b) {
a+b
}
This function can then be called as such: foo (1;2)
.
You may now be asking yourselves, “why is he talking about this stuff now?”
Well, there was one weirdness remaining. Support for empty elements in axis specifications, like so: a[1;]
could still be improved. Until now, an empty value in an n-tuple: (1;;2;3)
yielded (1 ; ⍬ ; 2 ; 3)
, but the ⍬
had some special hidden property that was used by the index operation so the standard APL syntax worked. This is obviously really ugly.
This behaviour has now been formalised as null
. The null
value is a scalar which is very similar to ⎕NULL
in Dyalog. An empty element in an n-tuple will now result in null
. This also makes it possible programmatically create a value that can be passed to the index operation, which makes things consistent (although perhaps not very useful since squad already exists).
Properties of null
The null
value is a scalar. In other words, it's a rank-0 object. The name null
is not a regular symbol, but rather a syntactic element, which means it does not have a namespace.
It's type is null
, which means that typeof null
returns kap:null
.
It's boolean value is true, in keeping with the specification that only the scalar value 0
is considered false, and all other values are true.
Next steps
Since there is now a proper null
value in Kap, there will be some further changes to the language. Currently, several functions returns ⍬
when there is no value to return. One such example is the return value from mapGet
when the requested key does not exist. This will be changed to return null
instead.