Skip to content

Commit 966a2c0

Browse files
author
dengsgo
committed
增加 max() min()支持可变参数
1 parent 4eb1def commit 966a2c0

File tree

2 files changed

+31
-10
lines changed

2 files changed

+31
-10
lines changed

engine/def.go

+31-9
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ func init() {
4141

4242
"noerr": {1, defNoerr},
4343

44-
"max": {2, defMax},
45-
"min": {2, defMin},
44+
"max": {-1, defMax},
45+
"min": {-1, defMin},
4646
}
4747
}
4848

@@ -107,18 +107,40 @@ func defCbrt(expr ...ExprAST) float64 {
107107
return math.Cbrt(ExprASTResult(expr[0]))
108108
}
109109

110+
// max(2) = 2
110111
// max(2, 3) = 3
112+
// max(2, 3, 1) = 3
111113
func defMax(expr ...ExprAST) float64 {
112-
return math.Max(p2(expr...))
114+
if len(expr) == 0 {
115+
panic("calling function `max` must have at least one parameter.")
116+
}
117+
if len(expr) == 1 {
118+
return ExprASTResult(expr[0])
119+
}
120+
maxV := ExprASTResult(expr[0])
121+
for i := 1; i < len(expr); i++ {
122+
v := ExprASTResult(expr[i])
123+
maxV = math.Max(maxV, v)
124+
}
125+
return maxV
113126
}
114127

115-
// max(2, 3) = 2
128+
// min(2) = 2
129+
// min(2, 3) = 2
130+
// min(2, 3, 1) = 1
116131
func defMin(expr ...ExprAST) float64 {
117-
return math.Min(p2(expr...))
118-
}
119-
120-
func p2(expr ...ExprAST) (float64, float64) {
121-
return ExprASTResult(expr[0]), ExprASTResult(expr[1])
132+
if len(expr) == 0 {
133+
panic("calling function `min` must have at least one parameter.")
134+
}
135+
if len(expr) == 1 {
136+
return ExprASTResult(expr[0])
137+
}
138+
maxV := ExprASTResult(expr[0])
139+
for i := 1; i < len(expr); i++ {
140+
v := ExprASTResult(expr[i])
141+
maxV = math.Min(maxV, v)
142+
}
143+
return maxV
122144
}
123145

124146
// noerr(1/0) = 0

engine/util_test.go

-1
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,6 @@ func TestParseAndExecError(t *testing.T) {
160160
"sin(1, 50)",
161161
"max(1,)",
162162
"min(1,)",
163-
"min(1,3, 099)",
164163
"1/0",
165164
"99.9 / (2-1-1)",
166165
"(1+2)3",

0 commit comments

Comments
 (0)