### 6.3.7 Return type of procedures

Although the SINGULAR language is a strongly typed programming language, the type of the return value of a procedure does not need to be specified. As a consequence, the return type of a procedure may vary, i.e., may, for example, depend on the input. However, the return value of such a procedure may then only be assigned to a variable of type `def`.

    proc type_return (int i)
    {
      if (i > 0) {return (i);}
      else {return (list(i));}
    }
    def t1 = type_return(1);
    def t2 = type_return(-1);
    typeof(t1); typeof(t2);
    ==> int
    ==> list

Furthermore, it is mandatory to assign the return value of a procedure to a variable of type `def`, if a procedure changes the current ring using the `keepring` command (see keepring) and returns a ring-dependent value (like a polynomial or module).

    proc def_return
    {
      ring r=0,(x,y),dp;
      poly p = x;
      keepring r;
      return (x);
    }
    def p = def_return();
    // poly p = def_return(); would be WRONG!!!
    typeof(p);
    ==> poly

On the other hand, more than one value can be returned by a single `return` statement. For example,

    proc tworeturn () { return (1,2); }
    int i,j = tworeturn();

User manual for Singular version 4-0-3, 2016, generated by texi2html.