### 3.5.3 Names

SINGULAR is a strongly typed language. This means that all names (= identifiers) have to be declared prior to their use. For the general syntax of a declaration, see the description of declaration commands (see General command syntax).

See Data types, for a description of SINGULAR's data types. See typeof, for a short overview of possible types. To get information on a name and the object named by it, the `type` command may be used (see type).

It is possible to redefine an already existing name if doing so does not change its type. A redefinition first sets the variable to the default value and then computes the expression. The difference between redefining and overriding a variable is shown in the following example:

      int i=3;
      i=i+1;        // overriding
      i;
    ==> 4
      int i=i+1;    // redefinition
    ==> // ** redefining i (  int i=i+1;    // redefinition) ./examples/Names.sin\
       g:4
      i;
    ==> 1

User defined names should start with a letter and consist of letters and digits only. As an exception to this rule, the characters `@`, and `_` may be used as part of a name, too (`@` as the first letter is reserved for purposes of library routines). Capital and small letters are distinguished. Indexed names are built as a name followed by an int_expression in parentheses. A list of indexed names can be built as a name followed by an intvec_expression in parentheses. For multi-indices, append an int_expression in parentheses to an indexed name. An alternative multi-index construction is `name_prefix(` index_1, index_2,... `)` where the `name_prefix` must be an undefined name.

      ring R;
      int n=3;
      ideal j(3);
      ideal j(n);     // is equivalent to the above
    ==> // ** redefining j(3) (  ideal j(n);     // is equivalent to the above) .\
       /examples/Names_1.sing:4
      ideal j(2)=x;
      j(2..3);
    ==> j(2)[1]=x j(3)[1]=0
      ring r=0,(x(1..2)(1..3)(1..2)),dp;
      r;
    ==> // coefficients: QQ considered as a field
    ==> // number of vars : 12
    ==> //        block   1 : ordering dp
    ==> //                  : names    x(1)(1)(1) x(1)(1)(2) x(1)(2)(1) x(1)(2)(2\
       ) x(1)(3)(1) x(1)(3)(2) x(2)(1)(1) x(2)(1)(2) x(2)(2)(1) x(2)(2)(2) x(2)(\
       3)(1) x(2)(3)(2)
    ==> //        block   2 : ordering C
      int i(1,2),i(2,3);
      i(2,3);
    ==> 0

Names must not coincide with reserved names (keywords). Type `reservedName();` to get a list of the reserved names. See reservedName. Names should not interfere with names of ring variables or, more generally, with monomials. See Identifier resolution.
The command `listvar` provides a list of the names in use (see listvar).

The most recently printed expression is available under the special name `_`, e.g.,

      ring r;
      ideal i=x2+y3,y3+z4;
      std(i);
    ==> _[1]=y3+x2
    ==> _[2]=z4-x2
      ideal k=_;
      k*k+x;
    ==> _[1]=y6+2x2y3+x4
    ==> _[2]=y3z4+x2z4-x2y3-x4
    ==> _[3]=z8-2x2z4+x4
    ==> _[4]=x
      size(_[3]);
    ==> 3

A string_expression enclosed in ```...``` (back ticks) evaluates to the value of the variable given by the string_expression. This feature is referred to as name substitution.

      int foo(1)=42;
      string bar="foo";
      `bar+"(1)"`;
    ==> 42

User manual for Singular version 4.4.1, 2025, generated by texi2html.