private Expression GenMapCall(MapCall ph, Expression prev) { Contract.Requires <ArgumentNullException>(ph != null); if (ph.FirstArg == null && prev == null) { throw Error("「それぞれ」の対象が指定されていません。", ph.Range.Start); } if (ph.FirstArg != null && prev != null) { throw Error("「それぞれ」の対象が二重に指定されています。", ph.Range.Start); } var value = prev ?? ElemGen.GenElem(ph.FirstArg.Argument); Expression lambda; { var param = Expression.Parameter(typeof(object), "要素"); var args = new List <Expression> { ElemGen.GenElemCore(ph.Target), param }; var sfxs = new List <string>(); if (ph.FirstArg != null) { sfxs.Add(ph.FirstArg.Suffix); } foreach (var pair in ph.Arguments) { args.Add(ElemGen.GenElem(pair.Argument)); sfxs.Add(pair.Suffix); } var callInfo = new CallInfo(args.Count - 1, sfxs); DynamicMetaObjectBinder binder; if (ph.Target.ElementType == ElementType.Symbol && !(args[0] is ParameterExpression)) { binder = Factory.InvokeMemberBinder(((Symbol)ph.Target).Name, callInfo); args[0] = Global; } else { binder = Factory.InvokeBinder(callInfo); } lambda = Expression.Lambda(Expression.Dynamic(binder, typeof(object), args), "それぞれ", new[] { param }); } return(Expression.Dynamic(Factory.MapBinder, typeof(object), lambda, value)); }
private Expression GenMapCall(MapCall ph, Expression prev) { Contract.Requires<ArgumentNullException>(ph != null); if (ph.FirstArg == null && prev == null) throw Error("「それぞれ」の対象が指定されていません。", ph.Range.Start); if (ph.FirstArg != null && prev != null) throw Error("「それぞれ」の対象が二重に指定されています。", ph.Range.Start); var value = prev ?? ElemGen.GenElem(ph.FirstArg.Argument); Expression lambda; { var param = Expression.Parameter(typeof(object), "要素"); var args = new List<Expression> { ElemGen.GenElemCore(ph.Target), param }; var sfxs = new List<string>(); if (ph.FirstArg != null) sfxs.Add(ph.FirstArg.Suffix); foreach (var pair in ph.Arguments) { args.Add(ElemGen.GenElem(pair.Argument)); sfxs.Add(pair.Suffix); } var callInfo = new CallInfo(args.Count - 1, sfxs); DynamicMetaObjectBinder binder; if (ph.Target.ElementType == ElementType.Symbol && !(args[0] is ParameterExpression)) { binder = Factory.InvokeMemberBinder(((Symbol)ph.Target).Name, callInfo); args[0] = Global; } else { binder = Factory.InvokeBinder(callInfo); } lambda = Expression.Lambda(Expression.Dynamic(binder, typeof(object), args), "それぞれ", new[] { param }); } return Expression.Dynamic(Factory.MapBinder, typeof(object), lambda, value); }