1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package org.millscript.millscript.functions;
23
24 import org.millscript.millscript.vm.Machine;
25 import org.millscript.millscript.vm.Package;
26
27 /**
28 * This class the common functionality required for a two argument function
29 * which returns a single result. This class allows simple binary functions to
30 * be implemented very easily.
31 */
32 public abstract class BinaryFunction extends Function {
33
34 /**
35 * @see Function#Function()
36 */
37 public BinaryFunction() {
38 super();
39 }
40
41 /**
42 * @see Function#Function(Package)
43 */
44 public BinaryFunction( final Package p ) {
45 super( p );
46 }
47
48 /**
49 * @see org.millscript.millscript.functions.Function#apply(org.millscript.millscript.vm.Machine, int)
50 */
51 @Override
52 public void apply( final Machine mc, final int nargs ) {
53 if ( nargs == 2 ) {
54 Object a2 = mc.popObject();
55 Object a1 = mc.popObject();
56 mc.pushObject( apply2( a1, a2 ) );
57 } else {
58 throw(
59 FunctionAlert.eval(
60 "Binary function being applied to wrong number of args",
61 "Binary functions take exactly two arguments"
62 ).culpritArgs( this, mc, nargs ).mishap()
63 );
64 }
65 }
66
67 /**
68 * Returns the result of this function when applied to the two specified
69 * arguments.
70 *
71 * @param a1 the first argument to the function
72 * @param a2 the second argument to the function
73 * @return the result of applying this function to the two arguments
74 */
75 public abstract Object apply2( final Object a1, final Object a2 );
76
77 }