public override void Substitute(IRVariable variable, IRExpression expression) { if (ReferenceEquals(Pointer, variable)) { Pointer = expression.CloneComplete(); } else { Pointer.Substitute(variable, expression); } }
public override void Substitute(IRVariable variable, IRExpression expression) { for (int i = 0; i < Arguments.Count; i++) { if (ReferenceEquals(Arguments[i], variable)) { Arguments[i] = expression.CloneComplete(); } else { Arguments[i].Substitute(variable, expression); } } }
public override void Substitute(IRExpression template, IRExpression substitution, OnMatchFoundHandler callback) { Pointer.Substitute(template, substitution, callback); var mapping = new Dictionary <IRVariable, IRExpression>(); if (Pointer.Unify(template, mapping) && callback(mapping)) { if (substitution is IRVariable v) { Pointer = mapping[v].CloneComplete(); } else { var newExpr = substitution.CloneComplete(); foreach (var varMap in mapping) { newExpr.Substitute(varMap.Key, varMap.Value); } Pointer = newExpr; } } }