dynamic evaluate(EvaluationType type, ContextModel context)

Evaluates this expression according to given type and context.

Source

evaluate(EvaluationType type, ContextModel context) {
  if (type == EvaluationType.VECTOR) {
    EvaluationType elementType = EvaluationType.REAL;

    if (length == 1) {
      // Does not seem to be a vector, try to return REAL.
      return elements[0].evaluate(elementType, context);
    }

    // Interpret vector elements as REAL.
    if (length == 2) {
      double x,y;
      x = elements[0].evaluate(elementType, context);
      y = elements[1].evaluate(elementType, context);
      return new Vector2(x, y);
    }

    if (length == 3) {
      double x,y,z;
      x = elements[0].evaluate(elementType, context);
      y = elements[1].evaluate(elementType, context);
      z = elements[2].evaluate(elementType, context);
      return new Vector3(x, y, z);
    }

    if (length == 4) {
      double x,y,z,w;
      x = elements[0].evaluate(elementType, context);
      y = elements[1].evaluate(elementType, context);
      z = elements[2].evaluate(elementType, context);
      w = elements[3].evaluate(elementType, context);
      return new Vector4(x, y, z, w);
    }

    if (length > 4) {
      throw new UnimplementedError("Vector of arbitrary length (> 4) are not supported yet.");
    }
  }

  if (type == EvaluationType.REAL && length == 1) {
    // Interpret vector as real number.
    return elements[0].evaluate(type, context);
  }

  throw new UnsupportedError('Vector $this with length $length can not be interpreted as: $type');
}