func rangex(str) { str.split(',').map { |r| var m = r.match(/^ (?(DEFINE) (?[+-]?[0-9]+) ) (?(?&int))-(?(?&int)) $/x) m ? do {var c = m.ncap; (Num(c{:from}) .. Num(c{:to}))...} : Num(r) } } say rangex('-6,-3--1,3-5,7-11,14,15,17-20').join(',')