1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.millscript.millscript.functions;
22
23 import org.millscript.commons.util.EList;
24 import org.millscript.millscript.vm.Machine;
25
26 /**
27 * This is the base class of all mutable list construction functions.
28 */
29 abstract class MutableListFunction extends ListFunction {
30
31 /**
32 * @see org.millscript.millscript.functions.Function#apply(org.millscript.millscript.vm.Machine, int)
33 */
34 @Override
35 public void apply( final Machine mc, final int nargs ) {
36 EList< Object > list = newEmptyMutableList();
37 initialize( mc, nargs, list );
38 mc.pushObject( list );
39 }
40
41 /**
42 * Returns the new empty mutable list for this function.
43 *
44 * @return a new empty mutable List
45 */
46 public abstract EList< Object > newEmptyMutableList();
47
48 /**
49 * Initialises the specified list with the specified number of arguments
50 * from the machine.
51 *
52 * @param mc the machine to get arguments from
53 * @param nargs the number of arguments available
54 * @param list the list to populate with the arguments
55 */
56 private static void initialize( final Machine mc, final int nargs, final EList< Object > list ) {
57 if ( nargs >= 1 ) {
58 Object x = mc.popObject();
59 initialize( mc, nargs - 1, list );
60 list.addLast( x );
61 }
62 }
63
64 }