@@ -95,6 +95,42 @@ namespace cadabra {
9595// }
9696 }
9797
98+ Ex_ptr Ex_join (const Ex_ptr ex1, const Ex_ptr ex2)
99+ {
100+ if (ex1->size () == 0 ) return ex2;
101+ if (ex2->size () == 0 ) return ex1;
102+
103+ bool comma1 = (*ex1->begin ()->name == " \\ comma" );
104+ bool comma2 = (*ex2->begin ()->name == " \\ comma" );
105+
106+ if (comma1 || comma2) {
107+ if (comma1) {
108+ auto ret = std::make_shared<Ex>(*ex1);
109+ auto loc = ret->append_child (ret->begin (), ex2->begin ());
110+ if (comma2)
111+ ret->flatten_and_erase (loc);
112+ return ret;
113+ }
114+ else {
115+ auto ret = std::make_shared<Ex>(ex2->begin ());
116+ auto loc = ret->prepend_child (ret->begin (), ex1->begin ());
117+ if (comma1)
118+ ret->flatten_and_erase (loc);
119+ return ret;
120+ }
121+ }
122+ else {
123+ auto ret = std::make_shared<Ex>(*ex1);
124+ if (*ret->begin ()->name != " \\ comma" )
125+ ret->wrap (ret->begin (), str_node (" \\ comma" ));
126+ ret->append_child (ret->begin (), ex2->begin ());
127+
128+ auto it = ret->begin ();
129+ cleanup_dispatch (*get_kernel_from_scope (), *ret, it);
130+ return ret;
131+ }
132+ }
133+
98134 Ex_ptr Ex_mul (const Ex_ptr ex1, const Ex_ptr ex2)
99135 {
100136 return Ex_mul (ex1, ex2, ex2->begin ());
@@ -652,6 +688,7 @@ namespace cadabra {
652688 .def (" from_sympy" , &sympy::SympyBridge::import_ex)
653689 ;
654690
691+ m.def (" join" , &Ex_join);
655692 m.def (" tree" , &print_tree);
656693
657694 m.def (" map_sympy" , &map_sympy_wrapper,
0 commit comments