1 package gnu.jemacs.lang; 2 import gnu.math.*; 3 import gnu.mapping.*; 4 5 public class AddOp extends ProcedureN 6 { 7 int plusOrMinus = 1; 8 9 public AddOp(String name, int plusOrMinus) 10 { 11 setName(name); 12 this.plusOrMinus = plusOrMinus; 13 } 14 15 public static final AddOp $Pl = new AddOp("+", 1); 16 public static final AddOp $Mn = new AddOp("-", -1); 17 18 public static Object apply2(int plusOrMinus, Object arg1, Object arg2) 19 { 20 Numeric num1 = ELisp.asNumber(arg1); 21 Numeric num2 = ELisp.asNumber(arg2); 22 return num1.add(num2, plusOrMinus); 23 } 24 25 public static Object $Pl(Object arg1, Object arg2) 26 { 27 return apply2(1, arg1, arg2); 28 } 29 30 public static Object $Mn(Object arg1, Object arg2) 31 { 32 return apply2(-1, arg1, arg2); 33 } 34 35 public static Object $Mn(Object arg1) 36 { 37 return ELisp.asNumber(arg1).neg(); 38 } 39 40 public static Object $Pl$V (Object arg1, Object arg2, 41 Object arg3, Object [] rest) 42 { 43 return applyN(1, apply2(1,apply2(1, arg1, arg2), arg3), rest); 44 } 45 46 public static Object $Mn$V (Object arg1, Object arg2, 47 Object arg3, Object [] rest) 48 { 49 return applyN(-1, apply2(-1,apply2(-1, arg1, arg2), arg3), rest); 50 } 51 52 public static Object applyN(int plusOrMinus, Object [] args) 53 { 54 int len = args.length; 55 if (len == 0) 56 return IntNum.zero (); 57 Object result = args[0]; 58 if (len == 1 && plusOrMinus < 0) 59 return $Mn(result); 60 for (int i = 1; i < len; i++) 61 result = apply2(plusOrMinus, result, args[i]); 62 return result; 63 } 64 65 public static Object applyN(int plusOrMinus, Object init, Object [] args) 66 { 67 int len = args.length; 68 Object result = init; 69 for (int i = 0; i < len; i++) 70 result = apply2(plusOrMinus, result, args[i]); 71 return result; 72 } 73 74 public Object applyN (Object [] args) 75 { 76 return applyN(plusOrMinus, args); 77 } 78 } 79 | Popular Tags |