Annotation of 41BSD/cmd/awk/EXPLAIN, revision 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.