diff --git a/examples/collatz/collatz.q b/examples/collatz/collatz.q new file mode 100644 index 0000000..3093312 --- /dev/null +++ b/examples/collatz/collatz.q @@ -0,0 +1,22 @@ +import log +import sys + +main() { + x := 12 + + loop { + if x & 1 == 0 { + x /= 2 + } else { + x = 3 * x + 1 + } + + log.number(x) + + if x == 1 { + return + } + + sys.write(1, " ", 1) + } +} \ No newline at end of file diff --git a/src/build/expression/Expression.go b/src/build/expression/Expression.go index 3a55506..55abb19 100644 --- a/src/build/expression/Expression.go +++ b/src/build/expression/Expression.go @@ -55,14 +55,16 @@ func (expr *Expression) Count(buffer []byte, kind token.Kind, name string) uint8 // Reset resets all values to the default. func (expr *Expression) Reset() { - for _, child := range expr.Children { - child.Reset() + expr.Parent = nil + + if expr.Children != nil { + expr.Children = expr.Children[:0] } expr.Token.Reset() - expr.Parent = nil - expr.Children = expr.Children[:0] + expr.Value = 0 expr.Precedence = 0 + expr.IsFolded = false } // EachLeaf iterates through all leaves in the tree. diff --git a/tests/examples_test.go b/tests/examples_test.go index 94d5f80..0ff6142 100644 --- a/tests/examples_test.go +++ b/tests/examples_test.go @@ -22,6 +22,7 @@ var examples = []struct { {"array", "", "Hello", 0}, {"echo", "Echo", "Echo", 0}, {"itoa", "", "9223372036854775807", 0}, + {"collatz", "", "6 3 10 5 16 8 4 2 1", 0}, } func TestExamples(t *testing.T) {