nil, true, false in literal arrays

Richard A. O'Keefe ok at cs.otago.ac.nz
Tue Feb 17 04:55:22 UTC 2004


Avi Bryant <avi at beta4.com> mentioned #(nil true false)
and asked
	Anyone know offhand what ANSI dictates here?
	
3.4.6.6 Array Literals
    An array literal is a sequenced collection with numeric keys which may
    contain any number of other literals.

    <array literal> ::= '#(' <array element>* ')'
    <array element> ::= <literal> | identifier
	
    ...
    If an identifier appeasr as an <array element> and it is one of
    the reserved identifiers nil, true or false the value of the
    corresponding element of the collection is the value of that
    reserved identifier.  The meaning is UNDEFINED if any other identifier
    is used as an <array element>.
    ...
	
3.4.6 Literals
    ...
    <literal> ::= <number literal>       "[-]number"
               |  <string literal>	 "'...''...'"
               |  <character literal>	 "$char"
               |  <symbol literal>       "#'string'"
               |  <selector literal>     "#selector"
               |  <array literal>

So according to ANSI,
    #(nil true false) contains a nil and two Booleans
    #(Nil True False) is is undefined, it need not have three elements,
        it need not even be a sequence.
    #(#'nil' #'true' #'false') contains three <symbol>s
    #(#nil #true #false) contains three selectors, which may well not
        be <symbols>, but then again, might be.
Rather surprisingly,
    #((1 2) (3 4))
is not even legal syntax in ANSI Smalltalk...




More information about the Squeak-dev mailing list