This commit is contained in:
ninemine
2025-07-02 13:11:26 +08:00
parent 4d49ab1990
commit d0dfe39fe9
6 changed files with 248 additions and 60 deletions

View File

@@ -1,21 +1,50 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;
namespace Convention.Symbolization.Internal
{
public abstract class Function : Variable
public abstract class Function : CloneableVariable<Function>
{
public readonly FunctionSymbol FunctionInfo;
public abstract Variable Invoke(Variable[] parameters);
public Function(string symbolName, Type returnType, Type[] parameterTypes, Modification[] modifiers)
protected Function(string symbolName,string functionName, Type returnType, Type[] parameterTypes, Modification[] modifiers) : base(symbolName)
{
FunctionInfo = new(symbolName, returnType, parameterTypes, modifiers);
FunctionInfo = new(functionName, returnType, parameterTypes, modifiers);
}
public abstract Variable Invoke(SymbolizationContext context, Variable[] parameters);
}
public sealed class DelegationalFunction : Function
{
public readonly MethodInfo methodInfo;
public DelegationalFunction(string symbolName, MethodInfo methodInfo)
: base(symbolName, methodInfo.Name, methodInfo.ReturnType, methodInfo.GetParameters().ToList().ConvertAll(x => x.ParameterType).ToArray(), Array.Empty<Modification>())
{
this.methodInfo = methodInfo!;
}
public override DelegationalFunction CloneVariable(string targetSymbolName)
{
return new DelegationalFunction(targetSymbolName, methodInfo);
}
public override bool Equals(Function other)
{
return other is DelegationalFunction df && df.methodInfo == this.methodInfo;
}
public override Variable Invoke(SymbolizationContext context, Variable[] parameters)
{
Variable invoker = parameters.Length > 0 ? parameters[0] : null;
Variable[] invokerParameters = parameters.Length > 0 ? parameters.Skip(1).ToArray() : Array.Empty<Variable>();
object result = methodInfo.Invoke(invoker, invokerParameters);
return result as Variable;
}
}
public readonly struct FunctionSymbol
{
public readonly string FunctionName;