#!/usr/bin/ksh93 ################################################################ # A discipline function is a function that is associated with a specific # variable. This allows you to define and call a function every time that # variable is referenced, set, or unset. These functions take the form of # varname.function, where varname is the name of the variable and function # is the discipline function. The predefined discipline functions are get, # set, and unset. # # * The varname.get function is invoked every time varname is # referenced. If the special variable .sh.value is set within this # function, then the value of varname is changed to this value. # A simple example is the time of day: # # $ function time.get # > { # > .sh.value=$(date +%r) # > } # $ print $time # 09:15:58 AM # $ print $time # it will change in a few seconds # 09:16:04 AM # # * The varname.set function is invoked every time varname is set. The # .sh.value variable is given the value that was assigned. The value # assigned to varname is the value of .sh.value when the function # completes. For example: # # $ function adder.set # > { # > let .sh.value=" # $ {.sh.value} + 1" # > } # $ adder=0 # $ echo $adder # 1 # $ adder=$adder # $ echo $adder # 2 # # * The varname.unset function is executed every time varname is # unset. The variable is not actually unset unless it is unset # within the function itself; otherwise it retains its value. # # Within all discipline functions, the special variable .sh.name is set to # the name of the variable, while .sh.subscript is set to the value of the # variables subscript, if applicable. # # Compound variables are supported. A compound variable allows a user to # specify multiple values within a single variable name. The values are # each assigned with a subscript variable, separated from the parent # variable with a . (period). For example: # # $ myvar=( x=1 y=2 ) # $ print "${myvar.x}" # 1 # ################################################################ function DATETIME.get { print "\ninside the DATETIME.get function" print ".sh.name=${.sh.name}" print ".sh.value=${.sh.value}" print ".sh.subscript=${.sh.subscript}" .sh.value=$( printf "%(%c)T\n" ) } ################################################################ function DATETIME.set { print "\ninside the DATETIME.set function" print ".sh.name=${.sh.name}" print ".sh.value=${.sh.value}" print ".sh.subscript=${.sh.subscript}" } ################################################################ function DATETIME.unset { print "\ninside the DATETIME.unset function" print ".sh.name=${.sh.name}" print ".sh.value=${.sh.value}" print ".sh.subscript=${.sh.subscript}" } ################################################################ DATETIME="test" print "${DATETIME}" unset DATETIME