def _make_arg_unwrapper(func, argstypes, funcname, has_self=False, simple=False): argtype_tuples = [] min_arg = 0 isdefault = False for i, typ in enumerate(argstypes): default_value = None if isinstance(typ, default): isdefault = True default_value = typ.default typ = typ.typ else: assert not isdefault, "non-default argument %s after default argument" % typ min_arg += 1 unwrapper, errorname = typ.make_unwrapper() type_errormsg = "expected %s as argument %s to %s, got " % ( errorname, i, funcname) argtype_tuples.append((i, unwrapper, isdefault, default_value, type_errormsg)) unroll_argtypes = unroll.unrolling_iterable(argtype_tuples) max_arity = len(argstypes) if min_arg == max_arity: aritystring = max_arity else: aritystring = "%s to %s" % (min_arg, max_arity) errormsg_arity = "expected %s arguments to %s, got " % ( aritystring, funcname) if min_arg == max_arity and not has_self and min_arg in (1, 2) and simple: func_arg_unwrap, call1, call2 = make_direct_arg_unwrapper( func, min_arg, unroll_argtypes, errormsg_arity) else: func_arg_unwrap = make_list_arg_unwrapper( func, has_self, min_arg, max_arity, unroll_argtypes, errormsg_arity) call1 = call2 = None _arity = Arity.oneof(*range(min_arg, max_arity+1)) return func_arg_unwrap, _arity, call1, call2
def wrapper(func): from pycket import values names = [n] if isinstance(n, str) else n name = names[0] if argstypes is not None: func_arg_unwrap, _arity, _, _ = _make_arg_unwrapper(func, argstypes, name, simple=simple) if arity is not None: _arity = arity else: func_arg_unwrap = func _arity = arity or Arity.unknown assert isinstance(_arity, Arity) func_result_handling = _make_result_handling_func(func_arg_unwrap, simple) result_arity = Arity.oneof(1) if simple else None return values.W_Prim(name, make_remove_extra_info(func_result_handling), arity=_arity, result_arity=result_arity)
class W_BaseParameter(W_Object): errorname = "parameter" _attrs_ = _immutable_fields_ = ["guard", "name"] ARITY = Arity.oneof(0, 1) def __init__(self, guard=None, name=OBJ_NAME): self.name = name self.guard = None if guard is values.w_false else guard def iscallable(self): return True def get_key(self): raise NotImplementedError("abstract base class") def get_arity(self, promote=False): return W_BaseParameter.ARITY def tostring(self): return "#<procedure:%s>" % self.name
def _make_arg_unwrapper(func, argstypes, funcname, has_self=False, simple=False): argtype_tuples = [] min_arg = 0 isdefault = False for i, typ in enumerate(argstypes): default_value = None if isinstance(typ, default): isdefault = True default_value = typ.default typ = typ.typ else: assert not isdefault, "non-default argument %s after default argument" % typ min_arg += 1 unwrapper, errorname = typ.make_unwrapper() type_errormsg = "expected %s as argument %s to %s, got " % ( errorname, i, funcname) argtype_tuples.append( (i, unwrapper, isdefault, default_value, type_errormsg)) unroll_argtypes = unroll.unrolling_iterable(argtype_tuples) max_arity = len(argstypes) if min_arg == max_arity: aritystring = max_arity else: aritystring = "%s to %s" % (min_arg, max_arity) errormsg_arity = "expected %s arguments to %s, got " % (aritystring, funcname) if min_arg == max_arity and not has_self and min_arg in (1, 2) and simple: func_arg_unwrap, call1, call2 = make_direct_arg_unwrapper( func, min_arg, unroll_argtypes, errormsg_arity) else: func_arg_unwrap = make_list_arg_unwrapper(func, has_self, min_arg, max_arity, unroll_argtypes, errormsg_arity) call1 = call2 = None _arity = Arity.oneof(*range(min_arg, max_arity + 1)) return func_arg_unwrap, _arity, call1, call2
def wrapper(func): from pycket import values names = [n] if isinstance(n, str) else n name = names[0] if argstypes is not None: func_arg_unwrap, _arity, _, _ = _make_arg_unwrapper(func, argstypes, name, simple=simple) if arity is not None: _arity = arity else: func_arg_unwrap = func _arity = arity or Arity.unknown assert isinstance(_arity, Arity) func_result_handling = _make_result_handling_func( func_arg_unwrap, simple) result_arity = Arity.oneof(1) if simple else None return values.W_Prim(name, make_remove_extra_info(func_result_handling), arity=_arity, result_arity=result_arity)
topic = values.w_false parent = values.w_false propagate_level = DEBUG try: topic = parser.symbol_or_false() parent = parser.logger_or_false() propagate_level = parser.log_level() except EndOfInput: pass # Any remaining arguments are propagate topics propagate_topic = parser._symbol_or_false() return values.W_Logger(topic, parent, propagate_level, propagate_topic) @expose("log-level?", [values.W_Object, values.W_Object, default(values.W_Object, values.w_false)]) def log_level(logger, level, topic): # TODO: Actual implementation return values.w_false @expose("log-message", arity=Arity.oneof(4, 5, 6)) def log_message(args): # TODO: Actual implementation return w_current_logger = values_parameter.W_Parameter(w_default_logger) expose_val("current-logger", w_current_logger)
try: topic = parser.symbol_or_false() parent = parser.logger_or_false() propagate_level = parser.log_level() except EndOfInput: pass # Any remaining arguments are propagate topics propagate_topic = parser._symbol_or_false() return values.W_Logger(topic, parent, propagate_level, propagate_topic) @expose("log-level?", [ values.W_Object, values.W_Object, default(values.W_Object, values.w_false) ]) def log_level(logger, level, topic): # TODO: Actual implementation return values.w_false @expose("log-message", arity=Arity.oneof(4, 5, 6)) def log_message(args): # TODO: Actual implementation return w_current_logger = values_parameter.W_Parameter(w_default_logger) expose_val("current-logger", w_current_logger)