nit: join() defaults to the empty string.