def _read_reader_macro(ctx: ReaderContext) -> LispReaderForm:
start = ctx.reader.advance()<EOL>assert start == "<STR_LIT:#>"<EOL>token = ctx.reader.peek()<EOL>if token == "<STR_LIT:{>":<EOL><INDENT>return _read_set(ctx)<EOL><DEDENT>elif token == "<STR_LIT:(>":<EOL><INDENT>return _read_function(ctx)<EOL><DEDENT>elif token == "<STR_LIT:'>":<EOL><INDENT>ctx.reader.advance()<EOL>s = _read_sym(ctx)<EOL>return llist.l(_VAR, s)<EOL><DEDENT>elif token == '<STR_LIT:">':<EOL><INDENT>return _read_regex(ctx)<EOL><DEDENT>elif token == "<STR_LIT:_>":<EOL><INDENT>ctx.reader.advance()<EOL>_read_next(ctx)  <EOL>return COMMENT<EOL><DEDENT>elif ns_name_chars.match(token):<EOL><INDENT>s = _read_sym(ctx)<EOL>assert isinstance(s, symbol.Symbol)<EOL>v = _read_next_consuming_comment(ctx)<EOL>if s in ctx.data_readers:<EOL><INDENT>f = ctx.data_readers[s]<EOL>return f(v)<EOL><DEDENT>else:<EOL><INDENT>raise SyntaxError(f"<STR_LIT>")<EOL><DEDENT><DEDENT>raise SyntaxError(f"<STR_LIT>")<EOL>
Return a data structure evaluated as a reader
    macro from the input stream.