### function 3: range

```
range:
description:
range(start, stop)
range(start, stop, step)
returns a superposition of kets starting at start, and finishing at stop
with step size step, if it is provided, otherwise step with size 1
if start and stop have categories, then so does the result
if the categories differ, then return the empty ket |>
now partially implemented as: start .. stop
in this form, you can't specify the step size

Now we can handle 2D ranges too:
Eg: |-1: -1> .. |1: 1>

examples:
range(|1>, |6>)
|1> + |2> + |3> + |4> + |5> + |6>

range(|number: 7>, |number: 13>)
|number: 7> + |number: 8> + |number: 9> + |number: 10> + |number: 11> + |number: 12> + |number: 13>

range(|2>, |4>, |0.5>)
|2> + |2.5> + |3> + |3.5> + |4>

range(|8>, |3>, |-1>)
|8> + |7> + |6> + |5> + |4> + |3>

-- an example using the new infix operator:
|13> .. |17>
|13> + |14> + |15> + |16> + |17>

-- an example of 2D range using the new infix operator:
|0: 0> .. |1: 1>
|0: 0> + |0: 1> + |1: 0> + |1: 1>

-- and another:
|-1: -1> .. |1: 1>
|-1: -1> + |-1: 0> + |-1: 1> + |0: -1> + |0: 0> + |0: 1> + |1: -1> + |1: 0> + |1: 1>