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]