def call(self, args, context): self.ensure_args_gt(args, 2) self.ensure_arg_type(args, 0, ast.name) name = args[0].name if context.has(name): raise ast.runtime_error("define: cannot redefine variable %s" % name) value = ast.statement_list(args[1:]).eval(context) context.set(name, value) return value
def ensure_arg_type(self, args, n, type): if not isinstance(args[n], type): msg = "%s: wrong type for argument %d (expected %s)" % (self.get_name(), n, type.__name__) raise(ast.runtime_error(msg))
def ensure_args_gt(self, args, n): if len(args) < n: msg = "%s: %d arguments provided, but at least %d were expected" % (self.get_name(), len(args), n) raise(ast.runtime_error(msg))
def ensure_type(self, value, type): if not isinstance(value, type): msg = "%s: wrong type for value (expected %s)" % (self.get_name(), type.__name__) raise(ast.runtime_error(msg))