using HeuristicLab.Algorithms.PushGP.Stack; namespace HeuristicLab.Algorithms.PushGP.Expressions { public class ExecDoRangeExpression : Expression { public ExecDoRangeExpression() : base(OpCode.ExecDoXRange) { } public override void Eval(IInterpreterService interpreterService) { // not enough arguments on stack if (interpreterService.IntegerStack.Count < 2 || interpreterService.ExecStack.Count == 0) return; var destinationIndex = interpreterService.IntegerStack.Pop(); var currentIndex = interpreterService.IntegerStack.Pop(); var loopBody = interpreterService.ExecStack.Pop(); if (destinationIndex == currentIndex) { interpreterService.IntegerStack.Push(currentIndex); interpreterService.ExecStack.Push(loopBody); } else { var nextIndex = destinationIndex < currentIndex ? currentIndex - 1 : currentIndex + 1; interpreterService.IntegerStack.Push(currentIndex); interpreterService.IntegerStack.Push(nextIndex); interpreterService.IntegerStack.Push(destinationIndex); var expression = new ExecDoRangeExpression(); interpreterService.ExecStack.Push(loopBody); interpreterService.ExecStack.Push(loopBody); interpreterService.ExecStack.Push(expression); } } } }