diff options
| author | mryouse | 2022-05-13 22:37:43 +0000 | 
|---|---|---|
| committer | mryouse | 2022-05-13 22:37:43 +0000 | 
| commit | 9ac2c37464ae95d78e9d410fa8ec71543fe46d8e (patch) | |
| tree | f90f73ccaf1150e52f6aa774ac58f529f5d60cc7 | |
| parent | 9641657502b966ff3068688eb45885da41926ae8 (diff) | |
have arithmetic functions take many numbers
| -rw-r--r-- | std.py | 60 | 
1 files changed, 42 insertions, 18 deletions
| @@ -44,26 +44,50 @@ def std_debug_off():      return NebBool(True)  # math -def std_add(arg1, arg2): -    res = arg1.value + arg2.value -    if isinstance(arg1, NebFloat) or isinstance(arg2, NebFloat): -        return NebFloat(res) +def std_add(arg, rest): +    float_type = True if isinstance(arg, NebFloat) else False +    if isinstance(rest, NebNumber): +        acc = arg.value + rest.value +        float_type = float_type or isinstance(rest, NebFloat)      else: -        return NebInt(res) +        acc = arg.value +        for item in rest: +            acc += item.value +            float_type = float_type or isinstance(item, NebFloat) +    if float_type: +        return NebFloat(acc) +    else: +        return NebInt(acc) -def std_subtract(arg1, arg2): -    res = arg1.value - arg2.value -    if isinstance(arg1, NebFloat) or isinstance(arg2, NebFloat): -        return NebFloat(res) +def std_subtract(arg, rest): +    float_type = True if isinstance(arg, NebFloat) else False +    if isinstance(rest, NebNumber): +        acc = arg.value - rest.value +        float_type = float_type or isinstance(rest, NebFloat) +    else: +        acc = arg.value +        for item in rest: +            acc -= item.value +            float_type = float_type or isinstance(item, NebFloat) +    if float_type: +        return NebFloat(acc)      else: -        return NebInt(res) +        return NebInt(acc) -def std_multiply(arg1, arg2): -    res = arg1.value * arg2.value -    if isinstance(arg1, NebFloat) or isinstance(arg2, NebFloat): -        return NebFloat(res) +def std_multiply(arg, rest): +    float_type = True if isinstance(arg, NebFloat) else False +    if isinstance(rest, NebNumber): +        acc = arg.value * rest.value +        float_type = float_type or isinstance(rest, NebFloat) +    else: +        acc = arg.value +        for item in rest: +            acc *= item.value +            float_type = float_type or isinstance(item, NebFloat) +    if float_type: +        return NebFloat(acc)      else: -        return NebInt(res) +        return NebInt(acc)  # strings  def std_concat(arg, rest): @@ -234,13 +258,13 @@ def build_std():      STD["debug-off"] = [debug_off]      # arithmetic -    add = FuncImpl(NebFunction("+", [NebNumber, NebNumber], NebNumber), std_add) +    add = FuncImpl(NebFunction("+", [NebNumber, NebNumber], NebNumber, [NebNumber]), std_add)      STD["+"] = [add] -    subtract = FuncImpl(NebFunction("-", [NebNumber, NebNumber], NebNumber), std_subtract) +    subtract = FuncImpl(NebFunction("-", [NebNumber, NebNumber], NebNumber, [NebNumber]), std_subtract)      STD["-"] = [subtract] -    multiply = FuncImpl(NebFunction("*", [NebNumber, NebNumber], NebNumber), std_multiply) +    multiply = FuncImpl(NebFunction("*", [NebNumber, NebNumber], NebNumber, [NebNumber]), std_multiply)      STD["*"] = [multiply]      # strings | 
