def make_number(num: str, repr_: str = None, speak: str = None):
if not num or is_unknown(num):<EOL><INDENT>return<EOL><DEDENT>if num == '<STR_LIT>':<EOL><INDENT>return Number('<STR_LIT>', <NUM_LIT>, '<STR_LIT>')  <EOL><DEDENT>if num in SPECIAL_NUMBERS:<EOL><INDENT>return Number(repr_ or num, None, SPECIAL_NUMBERS[num])  <EOL><DEDENT>if '<STR_LIT:/>' in num:<EOL><INDENT>nmr, dnm = [int(i) for i in num.split('<STR_LIT:/>')]<EOL>unpacked = unpack_fraction(num)<EOL>spoken = spoken_number(unpacked)<EOL>return Fraction(repr_ or num, nmr / dnm, spoken, nmr, dnm, unpacked)  <EOL><DEDENT>val = num.replace('<STR_LIT:M>', '<STR_LIT:->')<EOL>val = float(val) if '<STR_LIT:.>' in num else int(val)  <EOL>return Number(repr_ or num, val, spoken_number(speak or str(val)))<EOL>
Returns a Number or Fraction dataclass for a number string