diff options
author | Russ Cox <rsc@golang.org> | 2009-02-06 13:46:56 -0800 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2009-02-06 13:46:56 -0800 |
commit | 39ff860d8973ec9388d29d4206c2f63e1c3e3dcb (patch) | |
tree | b8e48ca2a3b0f4983102041168ebc81244a713e8 /test/closure.go | |
parent | defac22beba1644c0197e43df5ba7b0e2c305cf5 (diff) | |
download | go-39ff860d8973ec9388d29d4206c2f63e1c3e3dcb.tar.gz |
closures - runtime and debugger support, test case
R=r
DELTA=257 (250 added, 1 deleted, 6 changed)
OCL=24509
CL=24565
Diffstat (limited to 'test/closure.go')
-rw-r--r-- | test/closure.go | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/test/closure.go b/test/closure.go new file mode 100644 index 000000000..97361a1df --- /dev/null +++ b/test/closure.go @@ -0,0 +1,88 @@ +// $G $D/$F.go && $L $F.$A && ./$A.out + +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +var c = make(chan int); + +func check(a []int) { + for i := 0; i < len(a); i++ { + n := <-c; + if n != a[i] { + panicln("want", a[i], "got", n, "at", i); + } + } +} + +func f() { + var i, j int; + + i = 1; + j = 2; + f := func() { + c <- i; + i = 4; + g := func() { + c <- i; + c <- j; + }; + g(); + c <- i; + }; + j = 5; + f(); +} + +// Accumulator generator +func accum(n int) (func(int) int) { + return func(i int) int { + n += i; + return n; + } +} + +func g(a, b func(int) int) { + c <- a(2); + c <- b(3); + c <- a(4); + c <- b(5); +} + +func h() { + var x8 byte = 100; + var x64 int64 = 200; + + c <- int(x8); + c <- int(x64); + f := func(z int) { + g := func() { + c <- int(x8); + c <- int(x64); + c <- z; + }; + g(); + c <- int(x8); + c <- int(x64); + c <- int(z); + }; + x8 = 101; + x64 = 201; + f(500); +} + + +func main() { + go f(); + check([]int{1,4,5,4}); + + a := accum(0); + b := accum(1); + go g(a, b); + check([]int{2,4,6,9}); + + go h(); + check([]int{100,200,101,201,500,101,201,500}); +} |