def read_separated_elements(reader, separator, endc): oldinfo = reader.set_macro_character(separator, read_separator, isterminating=True) try: return tuple(listsplit( read_delimited_elements(reader, endc), Symbol(separator) )) finally: reader.set_macro_character(separator, *oldinfo)
def read_list(reader, c): elements = read_delimited_elements(reader, ']') # special case empty [] as \[] if len(elements) == 0: return (Symbol('mklist'),) object = elements[0] slice_parts = listsplit(elements[1:], Symbol(':')) if len(slice_parts) == 1: return (Symbol('subscript'), object) + tuple(slice_parts[0]) slice = [] for e in slice_parts: if len(e) == 0: slice.append(None) elif len(e) == 1: slice.append(e[0]) else: raise NoodleSyntaxError("Invalid slice: multiple values") return (Symbol('subscript'), object, (Symbol('mkslice'),) + tuple(slice))