@Override
    protected Value evaluate(ExecutionContext context) throws InterpretationException {

        Value val1 = ((AbsValueNode) this.getChildAt(0)).evaluate(context);
        Value val2 = ((AbsValueNode) this.getChildAt(1)).evaluate(context);

        if (val2.getType() == VariableType.STRING) {
            if (val1.getType() == VariableType.STRING) {
                String v1Val = (String) val1.getValue();

                if (v1Val.length() == 1) {
                    String v2Val = (String) val2.getValue();
                    return new Value(v1Val + v2Val);
                } else
                    throw new InterpretationException(InterpretationErrorType.INVALID_ARGUMENT, line, null);
            } else
                throw new InterpretationException(InterpretationErrorType.INVALID_ARGUMENT, line, null);
        } else if (val2.getType() == VariableType.ARRAYLIST) {
            ArrayList<Value> list = (ArrayList<Value>) val2.getValue();

            if (val1.getType() == VariableType.NUMBER || val1.getType() == VariableType.STRING) {
                list.add(0, val1);
                return new Value(list);
            } else
                throw new InterpretationException(InterpretationErrorType.INVALID_ARGUMENT, line, null);
        }

        throw new InterpretationException(InterpretationErrorType.INVALID_ARGUMENT, line, null);
    }