+std::ostream & operator<<(std::ostream & os, const exvector & e)
+{
+ print_context *p = get_print_context(os);
+ auto i = e.begin();
+ auto vend = e.end();
+
+ if (i==vend) {
+ os << "[]";
+ return os;
+ }
+
+ os << "[";
+ while (true) {
+ if (p == nullptr)
+ i -> print(print_dflt(os));
+ else
+ i -> print(*p);
+ ++i;
+ if (i==vend)
+ break;
+ os << ",";
+ }
+ os << "]";
+
+ return os;
+}
+
+std::ostream & operator<<(std::ostream & os, const exset & e)
+{
+ print_context *p = get_print_context(os);
+ auto i = e.begin();
+ auto send = e.end();
+
+ if (i==send) {
+ os << "<>";
+ return os;
+ }
+
+ os << "<";
+ while (true) {
+ if (p == nullptr)
+ i->print(print_dflt(os));
+ else
+ i->print(*p);
+ ++i;
+ if (i == send)
+ break;
+ os << ",";
+ }
+ os << ">";
+
+ return os;
+}
+
+std::ostream & operator<<(std::ostream & os, const exmap & e)
+{
+ print_context *p = get_print_context(os);
+ auto i = e.begin();
+ auto mend = e.end();
+
+ if (i==mend) {
+ os << "{}";
+ return os;
+ }
+
+ os << "{";
+ while (true) {
+ if (p == nullptr)
+ i->first.print(print_dflt(os));
+ else
+ i->first.print(*p);
+ os << "==";
+ if (p == nullptr)
+ i->second.print(print_dflt(os));
+ else
+ i->second.print(*p);
+ ++i;
+ if( i==mend )
+ break;
+ os << ",";
+ }
+ os << "}";
+
+ return os;
+}
+