@@ -69,7 +69,6 @@ func (st *programState) evaluateExpr(expr parser.ValueExpr) (Value, InterpreterE
6969 return value , nil
7070
7171 case * parser.BinaryInfix :
72-
7372 switch expr .Operator {
7473 case parser .InfixOperatorPlus :
7574 return st .plusOp (expr .Left , expr .Right )
@@ -85,6 +84,16 @@ func (st *programState) evaluateExpr(expr parser.ValueExpr) (Value, InterpreterE
8584 return nil , nil
8685 }
8786
87+ case * parser.Prefix :
88+ switch expr .Operator {
89+ case parser .PrefixOperator (parser .PrefixOperatorMinus ):
90+ return st .unaryNegOp (expr .Expr )
91+
92+ default :
93+ utils.NonExhaustiveMatchPanic [any ](expr .Operator )
94+ return nil , nil
95+ }
96+
8897 case * parser.FnCall :
8998 if ! st .varOriginPosition {
9099 err := st .checkFeatureFlag (flags .ExperimentalMidScriptFunctionCall )
@@ -214,6 +223,25 @@ func (st *programState) divOp(rng parser.Range, left parser.ValueExpr, right par
214223 return Portion (* rat ), nil
215224}
216225
226+ func (st * programState ) unaryNegOp (expr parser.ValueExpr ) (Value , InterpreterError ) {
227+ evExpr , err := evaluateExprAs (st , expr , expectOneOf (
228+ expectMapped (expectMonetary , func (m Monetary ) opNeg {
229+ return m
230+ }),
231+
232+ // while "x.map(identity)" is the same as "x", just writing "expectNumber" would't typecheck
233+ expectMapped (expectNumber , func (bi big.Int ) opNeg {
234+ return MonetaryInt (bi )
235+ }),
236+ ))
237+
238+ if err != nil {
239+ return nil , err
240+ }
241+
242+ return (* evExpr ).evalNeg (st )
243+ }
244+
217245func castToString (v Value , rng parser.Range ) (string , InterpreterError ) {
218246 switch v := v .(type ) {
219247 case AccountAddress :
0 commit comments