Annotation of 41BSD/cmd/awk/EXPLAIN, revision 1.1.1.1

1.1       root        1: Nov 30, 1979:
                      2: 
                      3: Awk has been modified yet again, in an attempt to make
                      4: its behavior more rational and predictable in the areas
                      5: of initialization, comparison, and type coercion.
                      6: Herewith what we believe the current truth to be:
                      7: 
                      8: 1. Each variable and field can potentially be a string
                      9: or a number or both at any time.
                     10: When a variable is set by the assignment
                     11:        v = expr
                     12: its type is set to that of expr.  (This includes +=, ++, etc.)
                     13: An arithmetic expression is of type number, a
                     14: concatenation is of type string,  and so on.
                     15: 
                     16: If the assignment is a simple copy, as in
                     17:        v1 = v2
                     18: then the type of v1 becomes that of v2.
                     19: 
                     20: 2. In comparisons, if both operands are numeric,
                     21: the comparison is made numerically.  Otherwise,
                     22: operands are coerced to string if necessary, and
                     23: the comparison is made on strings.
                     24: 
                     25: 3. The type of any expression can be coerced to
                     26: numeric by subterfuges (kludges?) such as
                     27:        expr + 0
                     28: and to string by
                     29:        expr ""
                     30: (i.e., concatenation with a null string).
                     31: 
                     32: 4. Uninitialized variables have the numeric value
                     33: 0 and the string value "".  Accordingly, if x is
                     34: uninitialized,
                     35:        if (x) ...
                     36: is false, and
                     37:        if (!x) ...
                     38:        if (x == 0) ...
                     39:        if (x == "") ...
                     40: are all true.  But note that
                     41:        if (x == "0") ...
                     42: is false.
                     43: 
                     44: 5. The type of a field is determined by context
                     45: when possible; for example,
                     46:        $1++
                     47: clearly implies that $1 is to be numeric, and
                     48:        $1 = $1 "," $2
                     49: implies that $1 and $2 are both to be strings.
                     50: Coercion will be done as needed.
                     51: 
                     52: In contexts where types cannot be reliably determined, e.g.,
                     53:        if ($1 == $2) ...
                     54: the type of each field is determined on input by
                     55: inspection.  All fields are strings; in addition,
                     56: each field that contains only a number (in the
                     57: sense of Fortran, say) is also considered numeric.
                     58: This ensures (for better or worse) that the test
                     59:        if ($1 == $2) ...
                     60: will succeed on the inputs
                     61:        0       0.0
                     62:        100     1e2
                     63:        +100    100
                     64:        1e-3    1e-3
                     65: and fail on the inputs
                     66:        (null)  0
                     67:        (null)  0.0
                     68:        2E-518  6E-427
                     69: as we believe it should.
                     70: 
                     71: Fields which are explicitly null have the string
                     72: value ""; they are not numeric.
                     73: Non-existent fields (i.e., fields past NF) are
                     74: treated this way too.
                     75: 
                     76: As it is for fields, so it is for array elements
                     77: created by split(...).
                     78: 
                     79: 6. There is no warranty of merchantability nor any warranty
                     80: of fitness for a particular purpose nor any other warranty,
                     81: either express or implied, as to the accuracy of the
                     82: enclosed materials or as to their suitability for any
                     83: particular purpose.  Accordingly, the AWK Development
                     84: Task Force assumes no responsibility for their use by the
                     85: recipient.   Further, the Task Force assumes no obligation
                     86: to furnish any assistance of any kind whatsoever, or to
                     87: furnish any additional information or documentation.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.