def _funcbody(self):
        pos = self._pos
        if self._accept(lexer.TokSymbol('(')) is None:
            return None

        namelist = self._namelist()
        dots = None
        if namelist is not None:
            if self._accept(lexer.TokSymbol(',')) is not None:
                dots_pos = self._pos
                dots = self._expect(lexer.TokSymbol('...'))
        else:
            dots_pos = self._pos
            dots = self._accept(lexer.TokSymbol('...'))
        if dots is not None:
            dots = VarargDots(start=dots_pos, end=self._pos)

        self._expect(lexer.TokSymbol(')'))
        block = self._assert(self._chunk(), 'block in funcbody')
        self._expect(lexer.TokKeyword('end'))
            
        return FunctionBody(namelist, dots, block, start=pos, end=self._pos)
sort an iterable, cast to ``col_map.get(colkey, default_type)``,
dataset/ETHPy150Open dansanderson/picotool/pico8/lua/parser.py/Parser._funcbody--crossover with--dataset/ETHPy150Open westurner/pyline/pyline.py/sort_by