from .. import TypeEnum, Environment, Arg, Builtin, evaluate, InterpretPanic, TypeWrap from ..structs import * BOOLEAN = Environment() def interpretEq(symbol, args, env, ns): # TODO this is a bit hacky if (isinstance(args[0], Type) or isinstance(args[0], TypeWrap)) and \ (isinstance(args[1], Type) or isinstance(args[1], TypeWrap)): if f"{args[0]}" == f"{args[1]}": return Bool(True) else: return Bool(False) elif type(args[0]) != type(args[1]): return Bool(False) elif isinstance(args[0], Literal): if args[0].value == args[1].value: return Bool(True) else: return Bool(False) else: raise InterpretPanic(symbol, "unknown comparison type", args[0]) eq_arg = Arg("value", TypeEnum.ANY) BOOLEAN.register("eq?", Builtin("eq?", interpretEq, [eq_arg, eq_arg], return_type=Type(":bool"))) def interpretNot(symbol, args, env, ns): return Bool(not args[0].value) not_arg = Arg("not", TypeEnum.BOOL) BOOLEAN.register("not", Builtin("not", interpretNot, [not_arg], return_type=Type(":bool")))