Skip to content

Instantly share code, notes, and snippets.

@takeshik
Created September 27, 2011 14:01
Show Gist options
  • Save takeshik/1245112 to your computer and use it in GitHub Desktop.
Save takeshik/1245112 to your computer and use it in GitHub Desktop.
{DispatchTypes.Method, "let", (e, s) =>
e.Arguments[0] is VectorExpression
? new SymbolTable(s).Let(ns => ((VectorExpression) e.Arguments[0]).Elements
.SelectMany(_ => _.List(":").Let(l => l != null
? new [] { l.First(), Expression.Default(((TypeCandidateExpression) l.Last().Reduce(s)).ElectedType), }
: EnumerableEx.Return(_)
))
.Share(_ => _.Zip(_, (i, v) => ((IdentifierExpression) i).Name.Let(n =>
v.Reduce(ns).Apply(r => ns.Add(n, Expression.Variable(r.Type, n)))
)))
.ToArray()
.Let(_ => Expression.Block(
ns.Literals.Values.OfType<ParameterExpression>(),
e.Arguments
.Skip(1)
.ReduceAll(ns)
.StartWith(ns.Literals.Values.Zip(_, Expression.Assign).ToArray())
))
)
: Expression.Block(e.Arguments.ReduceAll(s))
},
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment