lib/MissMatch.js
function parseArrayList(node) {
    consume(); // '('

    // a() matches the empty list.
    if(peek() === ')') {
      node.type = '()';
      return;
    }

    while (true) {
      // The whole array may be matched with 'a(|)' or (preferably) 'a'.
      if(peek() === '|') { break; }
      /**
       * Use clear() to allow whitespace on certain locations:
       * (n,n@x), (n, n@x), ( n , n@x ) are all accepted.
       * (n, n @x) is not accepted: bindings do not allow
       * any whitespace.
       */
      clear(); stage1(node.nodes); clear();
      if(peek() !== ',') {
        break;
      }
      consume(); // ','
    }
  }
function parseArrayList(node) {
    consume(); // '('

    // a() matches the empty list.
    if(peek() === ')') {
      node.type = '()';
      return;
    }

    while (true) {
      // The whole array may be matched with 'a(|)' or (preferably) 'a'.
      if(peek() === '|') { break; }
      /**
       * Use clear() to allow whitespace on certain locations:
       * (n,n@x), (n, n@x), ( n , n@x ) are all accepted.
       * (n, n @x) is not accepted: bindings do not allow
       * any whitespace.
       */
      clear(); stage1(node.nodes); clear();
      if(peek() !== ',') {
        break;
      }
      consume(); // ','
    }
  }
Parses the (...) component of an array pattern.