diff --git a/src/stdlib/functions/AbsoluteValue.cs b/src/stdlib/functions/AbsoluteValue.cs index 7279f9b..5245182 100644 --- a/src/stdlib/functions/AbsoluteValue.cs +++ b/src/stdlib/functions/AbsoluteValue.cs @@ -3,7 +3,7 @@ using ValueType = csmic.ValueType; namespace stdlib.functions { - public class AbsoluteValue : ICodedFunction + public class AbsoluteValue : FunctionBase, ICodedFunction { public IEnumerable ExpectedArguments { @@ -13,14 +13,15 @@ namespace stdlib.functions } } - public FunctionValue ReturnValue => new FunctionValue(ValueType.Numeric, 0m); + public FunctionValue ReturnValue + { + new FunctionValue(ValueType.Numeric, 0m); + } + => public FunctionValue Execute(params FunctionArgument[] args) { - if (args == null || args.Length < 1 || args[0] == null || args[0].Value == null) - { - return new FunctionValue(ValueType.None, null); - } + base.ArgumentCheck(args); try { diff --git a/src/stdlib/functions/FunctionBase.cs b/src/stdlib/functions/FunctionBase.cs new file mode 100644 index 0000000..ba8edf2 --- /dev/null +++ b/src/stdlib/functions/FunctionBase.cs @@ -0,0 +1,31 @@ +using csmic; +using ValueType = csmic.ValueType; + +namespace stdlib.functions +{ + public abstract class FunctionBase + { + public virtual IEnumerable ExpectedArguments { get; } + + internal bool ArgumentCheck(params FunctionArgument[] args) + { + if (args == null || args.Length != this.ExpectedArguments.Count()) + { + return false; + } + + var expectedArgumentsArray = this.ExpectedArguments.ToArray(); + for (int i = 0; i < args.Length; i++) + { + var expectedArgument = expectedArgumentsArray[i]; + var argument = args[i]; + if(argument.Value == null || argument.Value.Type != expectedArgument.Value.Type) + { + return false; + } + } + + return true; + } + } +}