/// <summary>
        /// Gets the return value from calling a function.
        /// </summary>
        /// <param name="scope">The scope object containing variable values.</param>
        /// <param name="result">[out] The new expression containing the function result.</param>
        /// <returns>
        ///   <c>true</c> if invocation was successful, <c>false</c> if something went wrong, in which case <paramref name="result" /> will likely be a <see cref="ParseErrorExpression" />.
        /// </returns>
        public bool Evaluate(InterpreterScope scope, out ExpressionBase result)
        {
            bool inAssignment = (scope.GetInterpreterContext <AssignmentExpression>() != null);

            if (inAssignment && _fullyExpanded)
            {
                // this function call is already fully expanded, allow it to be assigned without re-evaluating
                result = this;
            }
            else
            {
                if (!Evaluate(scope, inAssignment, out result))
                {
                    return(false);
                }
            }

            return(true);
        }