Skip to content

Commit 4b837c7

Browse files
jimmyfraschegriesemer
authored andcommitted
go/constant: add examples for working with constant.Value
Updates #24352. Change-Id: Ie7c1de905154a483b7f7748de28e35b484cce6ea Reviewed-on: https://go-review.googlesource.com/101279 Reviewed-by: Robert Griesemer <[email protected]> Run-TryBot: Robert Griesemer <[email protected]> TryBot-Result: Gobot Gobot <[email protected]>
1 parent 4b06d9d commit 4b837c7

File tree

1 file changed

+158
-0
lines changed

1 file changed

+158
-0
lines changed

src/go/constant/example_test.go

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
// Copyright 2018 The Go Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
5+
package constant_test
6+
7+
import (
8+
"fmt"
9+
"go/constant"
10+
"go/token"
11+
"sort"
12+
)
13+
14+
func Example_complexNumbers() {
15+
// Create the complex number 2.3 + 5i.
16+
ar := constant.MakeFloat64(2.3)
17+
ai := constant.MakeImag(constant.MakeInt64(5))
18+
a := constant.BinaryOp(ar, token.ADD, ai)
19+
20+
// Compute (2.3 + 5i) * 11.
21+
b := constant.MakeUint64(11)
22+
c := constant.BinaryOp(a, token.MUL, b)
23+
24+
// Convert c into a complex128.
25+
Ar, exact := constant.Float64Val(constant.Real(c))
26+
if !exact {
27+
fmt.Printf("Could not represent real part %s exactly as float64\n", constant.Real(c))
28+
}
29+
Ai, exact := constant.Float64Val(constant.Imag(c))
30+
if !exact {
31+
fmt.Printf("Could not represent imaginary part %s as exactly as float64\n", constant.Imag(c))
32+
}
33+
C := complex(Ar, Ai)
34+
35+
fmt.Println("literal", 25.3+55i)
36+
fmt.Println("go/constant", c)
37+
fmt.Println("complex128", C)
38+
39+
// Output:
40+
//
41+
// Could not represent real part 25.3 exactly as float64
42+
// literal (25.3+55i)
43+
// go/constant (25.3 + 55i)
44+
// complex128 (25.299999999999997+55i)
45+
}
46+
47+
func ExampleBinaryOp() {
48+
// 11 / 0.5
49+
a := constant.MakeUint64(11)
50+
b := constant.MakeFloat64(0.5)
51+
c := constant.BinaryOp(a, token.QUO, b)
52+
fmt.Println(c)
53+
54+
// Output: 22
55+
}
56+
57+
func ExampleUnaryOp() {
58+
vs := []constant.Value{
59+
constant.MakeBool(true),
60+
constant.MakeFloat64(2.7),
61+
constant.MakeUint64(42),
62+
}
63+
64+
for i, v := range vs {
65+
switch v.Kind() {
66+
case constant.Bool:
67+
vs[i] = constant.UnaryOp(token.NOT, v, 0)
68+
69+
case constant.Float:
70+
vs[i] = constant.UnaryOp(token.SUB, v, 0)
71+
72+
case constant.Int:
73+
// Use 16-bit precision.
74+
// This would be equivalent to ^uint16(v).
75+
vs[i] = constant.UnaryOp(token.XOR, v, 16)
76+
}
77+
}
78+
79+
for _, v := range vs {
80+
fmt.Println(v)
81+
}
82+
83+
// Output:
84+
//
85+
// false
86+
// -2.7
87+
// 65493
88+
}
89+
90+
func ExampleCompare() {
91+
vs := []constant.Value{
92+
constant.MakeString("Z"),
93+
constant.MakeString("bacon"),
94+
constant.MakeString("go"),
95+
constant.MakeString("Frame"),
96+
constant.MakeString("defer"),
97+
constant.MakeFromLiteral(`"a"`, token.STRING, 0),
98+
}
99+
100+
sort.Slice(vs, func(i, j int) bool {
101+
// Equivalent to vs[i] <= vs[j].
102+
return constant.Compare(vs[i], token.LEQ, vs[j])
103+
})
104+
105+
for _, v := range vs {
106+
fmt.Println(constant.StringVal(v))
107+
}
108+
109+
// Output:
110+
//
111+
// Frame
112+
// Z
113+
// a
114+
// bacon
115+
// defer
116+
// go
117+
}
118+
119+
func ExampleSign() {
120+
zero := constant.MakeInt64(0)
121+
one := constant.MakeInt64(1)
122+
negOne := constant.MakeInt64(-1)
123+
124+
mkComplex := func(a, b constant.Value) constant.Value {
125+
b = constant.MakeImag(b)
126+
return constant.BinaryOp(a, token.ADD, b)
127+
}
128+
129+
vs := []constant.Value{
130+
negOne,
131+
mkComplex(zero, negOne),
132+
mkComplex(one, negOne),
133+
mkComplex(negOne, one),
134+
mkComplex(negOne, negOne),
135+
zero,
136+
mkComplex(zero, zero),
137+
one,
138+
mkComplex(zero, one),
139+
mkComplex(one, one),
140+
}
141+
142+
for _, v := range vs {
143+
fmt.Printf("% d %s\n", constant.Sign(v), v)
144+
}
145+
146+
// Output:
147+
//
148+
// -1 -1
149+
// -1 (0 + -1i)
150+
// -1 (1 + -1i)
151+
// -1 (-1 + 1i)
152+
// -1 (-1 + -1i)
153+
// 0 0
154+
// 0 (0 + 0i)
155+
// 1 1
156+
// 1 (0 + 1i)
157+
// 1 (1 + 1i)
158+
}

0 commit comments

Comments
 (0)