| Variable |

    package ij.macro;

    class Variable implements MacroConstants {
        static final int VALUE=0, ARRAY=1, STRING=2;
        int symTabIndex;
        private double value;
        private String str;
        private Variable[] array;

        Variable() {
        }

        Variable(double value) {
            this.value = value;
        }

        Variable(int symTabIndex, double value, String str) {
            this.symTabIndex = symTabIndex;
            this.value = value;
            this.str = str;
        }

        Variable(int symTabIndex, double value, String str, Variable[] array) {
            this.symTabIndex = symTabIndex;
            this.value = value;
            this.str = str;
            this.array = array;
        }

        Variable(byte[] array) {
            this.array = new Variable[array.length];
            for (int i=0; i<array.length; i++)
                this.array[i] = new Variable(array[i]&255);
        }

        Variable(int[] array) {
            this.array = new Variable[array.length];
            for (int i=0; i<array.length; i++)
                this.array[i] = new Variable(array[i]);
        }

        Variable(double[] array) {
            this.array = new Variable[array.length];
            for (int i=0; i<array.length; i++)
                this.array[i] = new Variable(array[i]);
        }

        double getValue() {
            if (str!=null)
                    return convertToDouble();  // string to number conversions
            else
                return value;
        }

        double convertToDouble() {
            try {
                Double d = new Double(str);
                return d.doubleValue();
            } catch (NumberFormatException e){
                return Double.NaN;
            }
        }

        void setValue(double value) {
            this.value = value;
            str = null;
            array = null;
        }

        String getString() {
            return str;
        }

        void setString(String str) {
            this.str = str;
            value = 0.0;
            array = null;
        }

        Variable[] getArray() {
            return array;
        }

        void setArray(Variable[] array) {
            this.array = array;
            value = 0.0;
            str = null;
        }

        int getType() {
            if (array!=null)
                return ARRAY;
            else if (str!=null)
                return STRING;
            else
                return VALUE;
        }

        public String toString() {
            String s = "";
            if (array!=null)
                s += "array["+array.length+"]";
            else if (str!=null)
                s += str;
            else
                s += ""+value;
            return s+" "+symTabIndex;
        }

    } // class Variable

| Variable |