Skip to main content

LPC Substructures 1. Indexing and Ranging - General Introduction ---------------------------------------------- Since v20.25a6, MudOS provides a way of indexing or getting slices (which I will, following common use, call 'ranging') of strings/buffers/arrays/mappings (for mappings only indexing is available) as well as means of changing the values of data via lvalues (i.e. 'assignable values') formed by indexing/ranging. As an example, if we set str as "abcdefg", str[0] will be 'a', str[1] 'b' etc. Similarly, the nth element of an array arr is accessed via arr[n-1], and the value corresponding to key x of mapping m, m[x]. The '<' token can be used to denote indexing from the right, i.e. str[ )[a_1][a_2]...[a_n] ( )[a_1][a_2]...[a_n] (9) /* Remark: n >= 1 here */ assignment token is one of +=, -=, *=, &=, /=, %=, ^=, |=, =, <<=, >>=. However, because of the same reason that when we assign to a string, we obtain a new copy, (x = "foo")[2] = 'a' is invalidated at runtime. (One way to think about this is, essentially, assignment leaves the rhs as a return value, so x = "foo" returns "foo", the right hand side, which is not the same "foo" as the one in x. For arrays/buffers this is no problem because by assigning, we share the array/buffer) Call the lvalues in (9) complex lvalues. Then the following is also a valid lvalue: ( )[a_1][a_2]...[a_n] (10) and if we now call the above lvalues also complex lvalues, it would still be consistent, i.e. (((a[0] = b)[1] = c)[2] = d)[3] is an okay lvalue (though I wouldn't suggest using it for clarity's sake :)). Now, the last class of valid lvalues are range lvalues, which are denoted by ranging either a basic, indexed or complex lvalue: [n1..n2] [n1..n2] [n1..n2] plus other ranges such as [ y)[a] Diagnosis: Something like (x = foo)[2..3] or (x = foo) was taken to be an lvalue. Err 4: Illegal to have (x[a..b] y) to be the beginning of an lvalue Diagnosis: You did something as described, i.e. (x[1..6] = foo)[3] is not allowed. Err 5: Illegal lvalue Diagnosis: Oops, we are out of luck here :) Try looking at your lvalue more carefully, and see that it obeys the rules described in section 3 above. 5. Coming attractions --------------------- Perhaps a pointer type will be introduced to allow passing by reference into functions. Mappings may be multivalued and multi-indexable. Author : Symmetry@Tmi-2, IdeaExchange Last Updated : Tue Jan 10 11:02:40 EST 1995