示例#1
0
        public void ExecutionStepOverWhenNextOperationIsNotAnExpression()
        {
            var host = new LispHost();

            host.RootFrame.FunctionReturned += (s, e) =>
            {
                if (e.Frame.FunctionSymbol.Value == "COMMON-LISP-USER:TEST-METHOD")
                {
                    e.HaltExecution = true;
                }
            };
            var evalResult = host.Eval(@"
(defun test-method ()
    (+ 1 2))
(test-method)
(+ 4 5)
");

            Assert.False(evalResult.ExecutionState.IsExecutionComplete);
            Assert.Equal(3, ((LispInteger)evalResult.LastResult).Value);
            Assert.Null(evalResult.ExecutionState.PeekCurrentExpression());

            host.StepOver(evalResult.ExecutionState); // nothing to step over; it's really a step out
            Assert.False(evalResult.ExecutionState.IsExecutionComplete);
            Assert.Equal("s: (+ 4 5)", evalResult.ExecutionState.PeekOperation().ToString());

            host.EvalContinue(evalResult.ExecutionState);
            Assert.True(evalResult.ExecutionState.IsExecutionComplete);
            Assert.Equal(9, ((LispInteger)evalResult.LastResult).Value);;
        }
示例#2
0
        public void ExecutionCanStepOver(bool useTailCalls)
        {
            var host      = new LispHost(useTailCalls: useTailCalls);
            var hasHalted = false;

            host.RootFrame.EvaluatingExpression += (s, e) =>
            {
                if (!hasHalted && e.Expression.ToString() == "(+ 2 (- 5 3))")
                {
                    e.HaltExecution = true;
                    hasHalted       = true;
                }
            };
            var evalResult = host.Eval(@"
(defun test-method ()
    (+ 1 1)
    (+ 2 (- 5 3)) ; initial halt here
    (+ 3 3))
(test-method)
(+ 4 4)
");

            Assert.False(evalResult.ExecutionState.IsExecutionComplete);
            Assert.Equal("s: (+ 2 (- 5 3))", evalResult.ExecutionState.PeekOperation().ToString());

            host.StepOver(evalResult.ExecutionState);
            Assert.False(evalResult.ExecutionState.IsExecutionComplete);
            Assert.Equal("s: (+ 3 3)", evalResult.ExecutionState.PeekOperation().ToString());

            host.StepOver(evalResult.ExecutionState); // end of function, this was really a step out
            Assert.False(evalResult.ExecutionState.IsExecutionComplete);
            Assert.Equal("s: (+ 4 4)", evalResult.ExecutionState.PeekOperation().ToString());

            host.StepOver(evalResult.ExecutionState); // execution complete; this was the last operation
            Assert.True(evalResult.ExecutionState.IsExecutionComplete);
            Assert.Equal(8, ((LispInteger)evalResult.LastResult).Value);
        }