diff --git a/tconfpy.3 b/tconfpy.3 index 1a71ed8..cd8b8b5 100644 --- a/tconfpy.3 +++ b/tconfpy.3 @@ -972,10 +972,21 @@ undefined/non-existent variable. This generates an error. .IP \(bu 4 -Unless a variable as been marked as "Read Only" by the program, -you can continue to change its value as you go. Simply adding -another line at the end of our example above will change the value -of \'Greeting\' to something new: +The variable \'Greeting\' now contains the +.B string +"Hello Mr. Tconfpy, you look great for someone 101!" This is true even +if variable \'MYAGE\' has been defined by the calling program to be +an integer type. To repeat a previously-made point: All variable substitution +and comparison operations in a configuration file are done with +.B strings +regardless of the actual type of the variables involved. + + +.IP \(bu 4 +Unless a variable as been marked as "Read Only" by the application +program, you can continue to change its value as you go. Simply +adding another line at the end of our example above will change the +value of \'Greeting\' to something new: .nf Greeting = Generic Greeting Message @@ -988,16 +999,81 @@ particular application. You can then selectively override the variables you want to change in your own configuration file. -.IP \(bu 4 -The variable \'Greeting\' now contains the -.B string -"Hello Mr. Tconfpy, you look great for someone 101!" This is true even -if variable \'MYAGE\' has been defined by the calling program to be -an integer type. To repeat a previously-made point: All variable substitution -and comparison operations in a configuration file are done with -.B strings -regardless of the actual type of the variables involved. +.SS Indirect Variable Assignment +The dereferencing of a variable's value can take place on either +the right- or +.B left-hand-side +of an assignment statement. This means so-called "indirect" +variable assignments are permitted: + +.nf + CurrentTask = HouseCleaning + [CurrentTask] = Dad +.fi + +To understand what this does you need to realize that before +\*(TC does anything with a statement in a configuration file, it +replaces every variable reference with its associated value +(or produces an error for references to non-existent variables). +So the second statement above is first converted to: + +.nf + HouseCleaning = Dad +.fi + +i.e., The value \'Dad\' is assigned to a (new) variable called +\'HouseCleaning\'. In other words, putting a variable reference +on the left-hand-side of an assignment like this allows you +to access another variable which is named "indirectly". You have +to be careful when doing this, though. Consider a similar, but +slightly different example: + +.nf + CurrentTask = House Cleaning # This is fine + [CurrentTask] = Dad # Bad! +.fi + +The reason this no longer works is that the indirect +reference causes the second line to parse to: + +.nf + House Cleaning = Dad +.fi + +This is illegal because whitespace is not permitted in variable names. +\*(TC will produce an error if it sees such a construct. + +If you get into the habit of reading \'[something]\' as, +"The current value of \'something\'" this whole area of variable +naming and referencing will be easier to keep clear in your +thinking. See if you understand what the following does +(if you don't, try it out with \'test-tc.py\'): + +.nf + foo = 1 + bar = 2 + [foo] = bar + [bar] = [foo] +.fi + +You can get pretty creative with this since variable references +can occur pretty much anywhere in an assignment statement. +The only place they cannot appear is +.B within +another variable reference. That is, you cannot "nest" references: + +.nf + # The Following Is Fine + + FOO = Goodness + BAR = Me + Oh[FOO][BAR] = Goodness Gracious Me! + + # But This Does NOT Do What You Might Think + + [FOO[BAR]] = Something Or Other # Avoid nested constructs like this! +.fi .SS Lexical Namespaces