public void VisitApplication(TypedExpressions.Application d) { d.Left.AcceptVisitor(this); d.Right.AcceptVisitor(this); var functionType = typeConverter.Convert(d.LeftType); var callMethod = typeof(IFunction<,>).GetMethod(Constants.CallMethodName); body.Emit(OpCodes.Callvirt, TypeBuilder.GetMethod(functionType, callMethod)); }
public void VisitComposition(TypedExpressions.Composition d) { d.Right.AcceptVisitor(this); d.Left.AcceptVisitor(this); var leftType = typeConverter.Convert(d.LeftType); var middleType = typeConverter.Convert(d.MiddleType); var rightType = typeConverter.Convert(d.RightType); var defCtor = typeof(CompositeFunction<,,>).GetConstructors()[0]; var ctor = TypeBuilder.GetConstructor(typeof(CompositeFunction<,,>).MakeGenericType(leftType, middleType, rightType), defCtor); body.Emit(OpCodes.Newobj, ctor); }
public void VisitOutr(TypedExpressions.Outr d) { var leftType = typeConverter.Convert(d.LeftType); var rightType = typeConverter.Convert(d.RightType); var defCtor = typeof(OutrFunction<,>).GetConstructors()[0]; var ctor = TypeBuilder.GetConstructor(typeof(OutrFunction<,>).MakeGenericType(leftType, rightType), defCtor); body.Emit(OpCodes.Newobj, ctor); }
public void VisitIdentity(TypedExpressions.Identity d) { var type = typeConverter.Convert(d.Type); var defCtor = typeof(IdentityFunction<>).GetConstructors()[0]; var ctor = TypeBuilder.GetConstructor(typeof(IdentityFunction<>).MakeGenericType(type), defCtor); body.Emit(OpCodes.Newobj, ctor); }
public void VisitVariable(TypedExpressions.Variable d) { }
public void VisitApplication(TypedExpressions.Application d) { d.Left.AcceptVisitor(this); d.Right.AcceptVisitor(this); }
public void VisitAbstraction(TypedExpressions.Abstraction d) { d.PointFreeExpression.AcceptVisitor(this); }
public void VisitUncurry(TypedExpressions.Uncurried d) { d.Function.AcceptVisitor(this); var first = typeConverter.Convert(d.First); var second = typeConverter.Convert(d.Second); var output = typeConverter.Convert(d.Output); var defCtor = typeof(UncurriedFunction<,,>).GetConstructors()[0]; var ctor = TypeBuilder.GetConstructor(typeof(UncurriedFunction<,,>).MakeGenericType(first, second, output), defCtor); body.Emit(OpCodes.Newobj, ctor); }
public void VisitOutl(TypedExpressions.Outl d) { }
public void VisitInr(TypedExpressions.Inr d) { }
public void VisitInl(TypedExpressions.Inl d) { }
public void VisitIdentity(TypedExpressions.Identity d) { }
public void VisitConst(TypedExpressions.Const d) { d.Value.AcceptVisitor(this); }
public void VisitComposition(TypedExpressions.Composition d) { d.Left.AcceptVisitor(this); d.Right.AcceptVisitor(this); }
public void VisitCase(TypedExpressions.Case d) { d.Left.AcceptVisitor(this); d.Right.AcceptVisitor(this); }
public void VisitSplit(TypedExpressions.Split d) { d.Left.AcceptVisitor(this); d.Right.AcceptVisitor(this); var inputType = typeConverter.Convert(d.InputType); var leftType = typeConverter.Convert(d.LeftType); var rightType = typeConverter.Convert(d.RightType); var defCtor = typeof(SplitFunction<,,>).GetConstructors()[0]; var ctor = TypeBuilder.GetConstructor(typeof(SplitFunction<,,>).MakeGenericType(inputType, leftType, rightType), defCtor); body.Emit(OpCodes.Newobj, ctor); }
public void VisitSynonym(TypedExpressions.DataSynonym d) { var method = runtimeContainer.Resolve(d.Identifier); if (d.TypeParameters.Any()) { var typeParameters = new Type[d.TypeParameters.Count]; for (int i = 0; i < typeParameters.Length; i++) { typeParameters[i] = typeConverter.Convert(d.TypeParameters.Values.ElementAt(i)); } var genericMethod = method.MakeGenericMethod(typeParameters); body.Emit(OpCodes.Call, genericMethod); } else { body.Emit(OpCodes.Call, method); } }
public void VisitOutr(TypedExpressions.Outr d) { }
public void VisitVariable(TypedExpressions.Variable d) { throw new CompilerException(string.Format(ErrorMessages.UnexpectedVariable, d.Name)); }
public void VisitSplit(TypedExpressions.Split d) { d.Left.AcceptVisitor(this); d.Right.AcceptVisitor(this); }
public void VisitSynonym(TypedExpressions.DataSynonym d) { }
public void VisitUncurry(TypedExpressions.Uncurried d) { d.Function.AcceptVisitor(this); }
public void VisitConst(TypedExpressions.Const d) { d.Value.AcceptVisitor(this); var dom = typeConverter.Convert(d.InputType); var cod = typeConverter.Convert(d.OutputType); var defCtor = typeof(ConstantFunction<,>).GetConstructors()[0]; var ctor = TypeBuilder.GetConstructor(typeof(ConstantFunction<,>).MakeGenericType(dom, cod), defCtor); body.Emit(OpCodes.Newobj, ctor); }
public void VisitAbstraction(TypedExpressions.Abstraction d) { d.Body.AcceptVisitor(this); d.PointFreeExpression = VariableElimination.Visit(d.Body, d.Variable, d.VariableType, container); }