diff --git a/LINQ/LINQ/Interpreter/Expressions/FuncEval.vb b/LINQ/LINQ/Interpreter/Expressions/FuncEval.vb index fce47c8..372e7de 100644 --- a/LINQ/LINQ/Interpreter/Expressions/FuncEval.vb +++ b/LINQ/LINQ/Interpreter/Expressions/FuncEval.vb @@ -31,7 +31,7 @@ Namespace Interpreter.Expressions args.Add(item.Exec(context)) Next - Dim result As Object = invoke(args.ToArray) + Dim result As Object = DirectCast(invoke, Callable).Evaluate(args.ToArray) Return result End Function diff --git a/LINQ/LINQ/Interpreter/Expressions/Keywords/Options/PipelineKeyword.vb b/LINQ/LINQ/Interpreter/Expressions/Keywords/Options/PipelineKeyword.vb index b854cf0..7d4eebc 100644 --- a/LINQ/LINQ/Interpreter/Expressions/Keywords/Options/PipelineKeyword.vb +++ b/LINQ/LINQ/Interpreter/Expressions/Keywords/Options/PipelineKeyword.vb @@ -20,6 +20,10 @@ Namespace Interpreter.Expressions bin.right = FixLiteral(bin.right) ElseIf TypeOf expr Is Literals Then expr = New SymbolReference(DirectCast(expr, Literals).value) + ElseIf TypeOf expr Is FuncEval Then + DirectCast(expr, FuncEval).parameters = DirectCast(expr, FuncEval).parameters _ + .Select(AddressOf FixLiteral) _ + .ToArray End If Return expr diff --git a/LINQ/LINQ/Runtime/Callable.vb b/LINQ/LINQ/Runtime/Callable.vb index b1ee5ff..41d9a5f 100644 --- a/LINQ/LINQ/Runtime/Callable.vb +++ b/LINQ/LINQ/Runtime/Callable.vb @@ -5,6 +5,7 @@ Namespace Runtime Public Class Callable Dim method As MethodInfo + Dim parameters As ParameterInfo() Public ReadOnly Property name As String Get @@ -14,6 +15,7 @@ Namespace Runtime Sub New(method As MethodInfo) Me.method = method + Me.parameters = method.GetParameters End Sub Sub New(math1 As Func(Of Double, Double)) @@ -25,7 +27,21 @@ Namespace Runtime End Sub Public Function Evaluate(params As Object()) As Object - + Dim args As New List(Of Object) + + For i As Integer = 0 To parameters.Length - 1 + If i >= params.Length Then + If parameters(i).IsOptional Then + args.Add(parameters(i).DefaultValue) + Else + Throw New InvalidExpressionException + End If + Else + args.Add(CTypeDynamic(params(i), parameters(i).ParameterType)) + End If + Next + + Return method.Invoke(Nothing, args.ToArray) End Function End Class End Namespace \ No newline at end of file