using System; using HeuristicLab.Algorithms.PushGP.Interpreter; using HeuristicLab.Algorithms.PushGP.Stack; namespace HeuristicLab.Algorithms.PushGP.Expressions.Templates { public class DefineExpressionTemplate : ExpressionTemplate { private readonly Func> sourceStackProvider; private readonly Func creator; private readonly bool isCodeOp; public DefineExpressionTemplate(string symbol, Func> sourceStackProvider, Func creator, bool isCodeOp = false) : base(symbol) { this.sourceStackProvider = sourceStackProvider; this.creator = creator; this.isCodeOp = isCodeOp; } public override bool IsCodeOp { get { return this.isCodeOp; } } public override void Eval(IInterpreter interpreter) { var sourceStack = this.sourceStackProvider(interpreter); // not enough arguments on stack if (interpreter.NameStack.Count == 0 || sourceStack.Count == 0) return; var name = interpreter.NameStack.Pop(); var expression = creator(sourceStack.Top); if (interpreter.CustomExpressions.ContainsKey(name)) { interpreter.CustomExpressions[name] = expression; } else { interpreter.CustomExpressions.Add(name, expression); } } } }