@@ -280,7 +280,7 @@ impl Simple {
280280 } ;
281281 let mut value = first. value ( names) ?;
282282 for operand in operands {
283- value = value + operand. value ( names) ?;
283+ value += operand. value ( names) ?;
284284 }
285285 Ok ( value)
286286 }
@@ -323,7 +323,7 @@ impl Simple {
323323 let mut value: Real = self . operands . first ( ) . unwrap ( ) . value ( names) ?;
324324 let operands = self . operands . iter ( ) . skip ( 1 ) ;
325325 for operand in operands {
326- value = value - ( operand. value ( names) ?) ;
326+ value -= operand. value ( names) ?;
327327 }
328328 Ok ( value)
329329 }
@@ -353,7 +353,7 @@ impl Simple {
353353 } ;
354354 let mut value = first. value ( names) ?;
355355 for operand in operands {
356- value = value * operand. value ( names) ?;
356+ value *= operand. value ( names) ?;
357357 }
358358 Ok ( value)
359359 }
@@ -703,6 +703,8 @@ mod tests {
703703 "(l 5)" ,
704704 "(log 5)" ,
705705 "(log10 5)" ,
706+ "(log2 5)" ,
707+ "(lg 5)" ,
706708 "(exp 5)" ,
707709 "(e 5)" ,
708710 "(sqrt 5)" ,
@@ -823,6 +825,28 @@ mod tests {
823825 }
824826 }
825827
828+ #[ test]
829+ fn log2_aliases_parse_as_base2 ( ) {
830+ let empty = HashMap :: new ( ) ;
831+ for case in [ "(log2 1024)" , "(lg 1024)" ] {
832+ let xpr: Simple = case. parse ( ) . unwrap ( ) ;
833+ let result = xpr. evaluate ( & empty) . unwrap ( ) ;
834+ assert ! ( result. is_integer( ) , "{case}" ) ;
835+ assert_eq ! ( format!( "{result}" ) , "10" , "{case}" ) ;
836+ }
837+ }
838+
839+ #[ test]
840+ fn log2_parser_rejects_bad_domain_and_arity ( ) {
841+ let empty = HashMap :: new ( ) ;
842+
843+ let negative: Simple = "(lg -1)" . parse ( ) . unwrap ( ) ;
844+ assert_eq ! ( negative. evaluate( & empty) , Err ( Problem :: NotANumber ) ) ;
845+
846+ let wrong_arity: Simple = "(log2 2 4)" . parse ( ) . unwrap ( ) ;
847+ assert_eq ! ( wrong_arity. evaluate( & empty) , Err ( Problem :: ParseError ) ) ;
848+ }
849+
826850 #[ test]
827851 fn div_pi_e_4 ( ) {
828852 let empty = HashMap :: new ( ) ;
0 commit comments