protected override IType ValidateExpr(Environment env) { EnsureValidBinding(env); if (!(Binding.Type is IFunctionType func)) { throw new TranspilationException($"Cannot invoke non-invokable '{Name}'", Location); } AssertParameterCount(func); Exprs.ForEach(expr => expr.Validate(env)); if (func is GenericFunctionWrapper wrapper) { func = SpecifyFunc(wrapper, env); } else if (Handle != null) { throw new TranspilationException($"Cannot specify generic types for non-generic function '{Name}'.", Location); } foreach (var(expr, type) in Exprs.Zip(func.ParameterTypes)) { expr.AssertType(type); } // We re-assign the name such that it will be converted properly Name = Binding?.Name ?? Name; return(func.ReturnType); }
public object ToEnumerableLoop(BindingCallExpr expr) { var token = expr.ParamList[2] as TokenData; var varname = (string)expr.ParamList[0]; var enableWith = (bool)expr.ParamList[1]; var collectionName = varname + "s"; var varExpr = Exprs.Ident(collectionName, token); var loopexpr = Exprs.ForEach(varname, varExpr, token); ((BlockExpr)loopexpr).EnableAutoVariable = enableWith; return(loopexpr); }
/// <summary> /// return value; /// </summary> /// <returns></returns> private Expr ParseForIn() { var startToken = _tokenIt.NextToken; var varname = _tokenIt.ExpectId(); _tokenIt.Expect(Tokens.In); var sourcename = _tokenIt.ExpectId(); _tokenIt.Expect(Tokens.RightParenthesis); var stmt = Exprs.ForEach(varname, new ConstantExpr(sourcename), startToken) as BlockExpr; ParseBlock(stmt); return(stmt); }