def contains_q(args: List[MalExpression]) -> MalExpression: if len(args) < 2: raise MalInvalidArgumentException(MalNil(), "contains? requires two arguments") if not isinstance(args[0], MalHash_map): raise MalInvalidArgumentException(args[0], "not a hash-map") if not isinstance(args[1], MalString): return MalBoolean(False) return MalBoolean(args[1].native() in args[0].native())
def equal(a: MalExpression, b: MalExpression) -> MalBoolean: if (isinstance(a, MalList) or isinstance(a, MalVector)) and (isinstance( b, MalList) or isinstance(b, MalVector)): a_native = a.native() b_native = b.native() if len(a_native) != len(b_native): return MalBoolean(False) for x in range(0, len(a_native)): if not equal(a_native[x], b_native[x]): return MalBoolean(False) return MalBoolean(True) if type(a) == type(b) and a.native() == b.native(): return MalBoolean(True) return MalBoolean(False)
def test_if_basic_false_no_fourth_arg(self): env = Env(None) self.assertEqual( "nil", str( step4_if_fn_do.EVAL( MalList([MalSymbol("if"), MalBoolean(False), MalInt(4321)]), env ) ), )
def test_if_basic_false(self): env = Env(None) self.assertEqual( 1234, step4_if_fn_do.EVAL( MalList( [MalSymbol("if"), MalBoolean(False), MalInt(4321), MalInt(1234)] ), env, ).native(), )
def empty_q(x: MalExpression) -> MalBoolean: if sequential_q(x): return MalBoolean(len(x.native()) == 0) raise MalInvalidArgumentException(x, "not a list")
def list_q(x: MalExpression) -> MalBoolean: if isinstance(x, MalList): return MalBoolean(True) return MalBoolean(False)
def sequential_q(arg: MalExpression) -> MalExpression: return MalBoolean(isinstance(arg, MalList) or isinstance(arg, MalVector))
def map_q(arg: MalExpression) -> MalExpression: return MalBoolean(isinstance(arg, MalHash_map))
def vector_q(arg: MalExpression) -> MalExpression: return MalBoolean(isinstance(arg, MalVector))
def symbol_q(arg: MalExpression) -> MalExpression: return MalBoolean(isinstance(arg, MalSymbol))
def false_q(arg: MalExpression) -> MalExpression: return MalBoolean(isinstance(arg, MalBoolean) and not arg.native())
def true_q(arg: MalExpression) -> MalExpression: return MalBoolean(isinstance(arg, MalBoolean) and arg.native())
def nil_q(arg: MalExpression) -> MalExpression: return MalBoolean(isinstance(arg, MalNil))
def not_(expr: MalExpression) -> MalExpression: if isinstance(expr, MalNil) or (isinstance(expr, MalBoolean) and expr.native() is False): return MalBoolean(True) else: return MalBoolean(False)
"<=": MalFunctionCompiled(lambda args: less_equal(args[0], args[1])), ">": MalFunctionCompiled(lambda args: less(args[1], args[0])), ">=": MalFunctionCompiled(lambda args: less_equal(args[1], args[0])), "read-string": MalFunctionCompiled(lambda args: read_string(args[0])), "slurp": MalFunctionCompiled(lambda args: slurp(args[0])), "str": MalFunctionCompiled(lambda args: core_str(args)), "atom": MalFunctionCompiled(lambda args: MalAtom(args[0])), "atom?": MalFunctionCompiled(lambda args: MalBoolean(isinstance(args[0], MalAtom))), "deref": MalFunctionCompiled(lambda args: deref_q(args[0])), "reset!": MalFunctionCompiled(lambda args: reset(args[0], args[1])), "cons": MalFunctionCompiled(lambda args: cons(args[0], args[1])), "concat": MalFunctionCompiled(concat), "not": MalFunctionCompiled(lambda args: not_(args[0])), "nth": MalFunctionCompiled(lambda args: nth(args[0], args[1])), "apply": MalFunctionCompiled(lambda args: apply(args)), "map":
def visit_mBoolean(self, node, children) -> MalBoolean: if node.value == "true": return MalBoolean(True) if node.value == "false": return MalBoolean(False) raise Exception("Internal reader error")
def less_equal(a: MalExpression, b: MalExpression) -> MalBoolean: if not isinstance(a, MalInt): raise MalInvalidArgumentException(a, "not an int") if not isinstance(b, MalInt): raise MalInvalidArgumentException(b, "not an int") return MalBoolean(a.native() <= b.native())
def keyword_q(arg: MalExpression) -> MalExpression: return MalBoolean(isinstance(arg, MalString) and arg.is_keyword())