|
using System;
using System.Collections;
using System.Reflection;
namespace YAMP
{
abstract class ArgumentFunction : StandardFunction
{
protected Value[] arguments;
Hashtable functions;
public ArgumentFunction ()
{
functions = new Hashtable();
var methods = this.GetType().GetMethods();
foreach(var method in methods)
{
if(method.Name.Equals("Function"))
{
var args = method.GetParameters().Length;
functions.Add(args, method);
}
}
}
public override Value Perform (Value argument)
{
if(argument is ScalarValue)
arguments = new Value[] { argument };
else if(argument is StringValue)
arguments = new Value[] { argument };
else if(argument is MatrixValue)
{
var vec = argument as MatrixValue;
if(vec.DimensionY > 1)
throw new ArgumentException(name);
arguments = new Value[vec.DimensionX];
for(var i = 0; i < arguments.Length;)
arguments[i] = vec[++i];
}
else if(argument is ArgumentsValue)
arguments = (argument as ArgumentsValue).Values;
else
throw new ArgumentException(name);
return Execute();
}
Value Execute()
{
if(functions.ContainsKey(arguments.Length))
{
var method = (functions[arguments.Length] as MethodInfo);
try
{
return method.Invoke(this, arguments) as Value;
}
catch (Exception ex)
{
throw ex.InnerException;
}
}
throw new ArgumentsException(name, arguments.Length);
}
}
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
Florian lives in Munich, Germany. He started his programming career with Perl. After programming C/C++ for some years he discovered his favorite programming language C#. He did work at Siemens as a programmer until he decided to study Physics.
During his studies he worked as an IT consultant for various companies. After graduating with a PhD in theoretical particle Physics he is working as a senior technical consultant in the field of home automation and IoT.
Florian has been giving lectures in C#, HTML5 with CSS3 and JavaScript, software design, and other topics. He is regularly giving talks at user groups, conferences, and companies. He is actively contributing to open-source projects. Florian is the maintainer of AngleSharp, a completely managed browser engine.