Ellipsis¶
Sets and lists may be defined using ellipsis, that is, two or more dots meaning (intuitively) “and so on”. For example:
Disco> {1 .. 5}
{1, 2, 3, 4, 5}
Disco> [2, 4 ... 10]
[2, 4, 6, 8, 10]
Disco> [1, 4, 9 ... 100]
[1, 4, 9, 16, 25, 36, 49]
Note, Disco isn’t actually being all that smart here, and it won’t work for any pattern at all. For example, it fails miserably to understand that we want a list of primes:
Disco> [2, 3, 5, 7, 11 ... 100]
[2, 3, 5, 7, 11, 22, 48, 100]
So what is Disco actually doing? Note first that there must always be a single number after the dots.
If there is a single number before the dots:
If the first number is smaller than the last number, the resulting list or set starts at the first number and counts up by ones until reaching the last number.
Disco> {1 .. 5} {1, 2, 3, 4, 5}
If the first number is greater than the last number, it counts down instead of up.
Disco> [10 .. 7] [10, 9, 8, 7]
If there are \(k > 1\) numbers before the dots, Disco fits a \(k-1\)-degree polynomial to the numbers and then extends it until the next value would be greater than the value after the dots.
For example, for \(k = 2\), this just means that Disco will extend the list using a constant gap between consecutive values (the same as the gap between the first two numbers):
Disco> [1, 3 .. 10] [1, 3, 5, 7, 9] Disco> {5, 10 .. 40} {5, 10, 15, 20, 25, 30, 35, 40}
For \(k = 3\), Disco will use a quadratic polynomial, which means we can generate things like the squares or the triangular numbers:
Disco> [1, 4, 9 ... 100] [1, 4, 9, 16, 25, 36, 49] Disco> [1, 3, 6 ... 28] [1, 3, 6, 10, 15, 21, 28]