/** @page builtin_functions_page Qore Builtin Functions

    @note This section is out of date; \c qpp should be used to generate cpp files with bindings for %Qore instead

    @section builtin_functions Qore Builtin Functions

    @subsection handling_function_arguments Handling Function Arguments

    @subsection function_return_value Function Return Value

    Each Qore function should return a QoreValue giving the return value of the function.  If the function does not
    return a value, then it should simply return QoreValue() as in the following \c qpp code:

    @code{.cpp}
//! Ignores all arguments and returns no value
/**
*/
QoreValue noop() [flags=CONTANT] {
    return QoreValue();
}
    @endcode

    @subsection function_raising_exceptions Raising Exceptions in a Function

    If your function raises an exception, then you must call ExceptionSink::raiseException() against the ExceptionSink
    argument to the function.  In the case that your function raises a Qore-language exception, the function must
    \b always return QoreValue() as a return value.  The following \c qpp code is an example:

    @code{.cpp}
nothing remove_signal_handler(softint signal) [dom=PROCESS] {
    if (signal <= 0 || signal > QORE_SIGNAL_MAX) {
        xsink->raiseException("REMOVE-SIGNAL-HANDLER-ERROR", "%d is not a valid signal", signal);
        return QoreValue();
    }
    QSM.removeHandler(signal, xsink);
}
    @endcode
*/
