def _parse_value(code: str) -> Tuple[data.Value, str]: if code.startswith('\''): value, rest_code = _parse_value(code[1:]) return _make_quote(value), rest_code if code.startswith('('): values, rest_code = _parse_list(code[1:]) rest_code = _parse_skip(rest_code) if not rest_code.startswith(')'): raise ParseError(rest_code) return data.from_native_list(values), rest_code[1:] match = _TOKEN_RE.search(code) if not match: raise ParseError(code) token = match.group() if _NUM_RE.search(token): value = data.Int(int(token)) elif token == '#f': value = data.Bool(False) elif token == '#t': value = data.Bool(True) else: value = data.Symbol(token) return value, code[match.end():]
def _builtin_or(args: List[data.Value]) -> data.Value: result = False for value in args: result = result or value != data.FALSE return data.Bool(result)
def _builtin_and(args: List[data.Value]) -> data.Value: result = True for value in args: result = result and value != data.FALSE return data.Bool(result)
def _builtin_gte(args: List[data.Value]) -> data.Value: assert len(args) == 2 lhs, rhs = args assert isinstance(lhs, data.Int), 'not integer' assert isinstance(rhs, data.Int), 'not integer' return data.Bool(lhs.raw_value >= rhs.raw_value)
def _builtin_eq_check(args: List[data.Value]) -> data.Value: assert len(args) == 2 lhs, rhs = args return data.Bool(lhs is rhs)
def _builtin_not(args: List[data.Value]) -> data.Value: assert len(args) == 1 value = args[0] return data.Bool(not (value != data.FALSE))