<!---  Produced by FS2LSL (Flash Scratch to LSL),  John K. Bennett,  ATLAS Institute, University of Colorado at Boulder,  http://redwood.colorado.edu/jkb/fs2lsl/  -->
<program>
  <globvars>
    <stack x="10" y="5">
      <block spec="Declare Global Variables"/>
      <block spec="global comment: %s">
        <blockarg val="Listing 5.8: Personalized Memory Greeter"/>
      </block>
      <block spec="create global var: %g type: %m value: %t">
        <blockarg val="MEMORY_LENGTH"/>
        <blockarg val="integer"/>
        <blockarg val="25"/>
      </block>
      <block spec="global comment: %s">
        <blockarg val="3600 seconds * 12h"/>
      </block>
      <block spec="create global var: %g type: %m value: %t">
        <blockarg val="gAfternoon"/>
        <blockarg val="integer"/>
        <blockarg val="43200"/>
      </block>
      <block spec="global comment: %s">
        <blockarg val="3600 seconds * 18h"/>
      </block>
      <block spec="create global var: %g type: %m value: %t">
        <blockarg val="gEvening"/>
        <blockarg val="integer"/>
        <blockarg val="64800"/>
      </block>
      <block spec="create global var: %g type: %m value: %t">
        <blockarg val="gRecentVisitors"/>
        <blockarg val="list"/>
        <blockarg val="none"/>
      </block>
      <block spec="create global var: %g type: %m value: %t">
        <blockarg val="gGreetingFirst"/>
        <blockarg val="string"/>
        <blockarg val="&quot; Welcome to here &quot;"/>
      </block>
      <block spec="create global var: %g type: %m value: %t">
        <blockarg val="gGreetingReturn"/>
        <blockarg val="string"/>
        <blockarg val="&quot; Welcome Back to here &quot;"/>
      </block>
      <block spec="create global var: %g type: %m value: %t">
        <blockarg val="gBeChatty"/>
        <blockarg val="integer"/>
        <blockarg val="TRUE"/>
      </block>
    </stack>
  </globvars>
  <functions>
    <func>
      <stack x="11" y="293">
        <block funcSpec="string sayTimeOfDay()"/>
        <block spec="create local var: %g type: %m value: %t">
          <blockarg val="timeOfDay"/>
          <blockarg val="float"/>
          <block spec="wallclock: seconds since midnight (PST)"/>
        </block>
        <block spec="ifelse %b">
          <block spec=" %n %Q %n ">
            <block varName="timeOfDay" varScope="local"/>
            <blockarg val="&lt;"/>
            <block varName="gAfternoon" varScope="global"/>
          </block>
          <stack>
            <block spec="return( %s )">
              <blockarg val="&quot;Good Morning!&quot;"/>
            </block>
          </stack>
          <stack>
            <block spec="ifelse %b">
              <block spec=" %n %Q %n ">
                <block varName="timeOfDay" varScope="local"/>
                <blockarg val="&lt;"/>
                <block varName="gEvening" varScope="global"/>
              </block>
              <stack>
                <block spec="return( %s )">
                  <blockarg val="&quot;Good Afternoon!&quot;"/>
                </block>
              </stack>
              <stack>
                <block spec="return( %s )">
                  <blockarg val="&quot;Good Evening!&quot;"/>
                </block>
              </stack>
            </block>
          </stack>
        </block>
      </stack>
    </func>
  </functions>
  <states>
    <state>
      <stacks>
        <stack x="14" y="554">
          <block spec="state %s">
            <blockarg val="default"/>
          </block>
          <block spec="when I enter this state"/>
          <block spec="set %s = %n">
            <block varName="gRecentVisitors" varScope="global"/>
            <blockarg val="[]"/>
          </block>
          <block spec="sensor sweep every %n seconds at range %s">
            <blockarg val="5"/>
            <blockarg val="6"/>
          </block>
        </stack>
        <stack x="17" y="685">
          <block spec="when sensor triggers"/>
          <block spec="create local var: %g type: %m value: %t">
            <blockarg val="visitor"/>
            <blockarg val="string"/>
            <block spec="detected %Z %s">
              <blockarg val="object (name)"/>
              <blockarg val="0"/>
            </block>
          </block>
          <block spec="create local var: %g type: %m value: %t">
            <blockarg val="index"/>
            <blockarg val="integer"/>
            <block spec="index of sublist %s in list %s">
              <block spec="%s as a %m">
                <block varName="visitor" varScope="local"/>
                <blockarg val="list"/>
              </block>
              <block varName="gRecentVisitors" varScope="global"/>
            </block>
          </block>
          <block spec="ifelse %b">
            <block spec=" %n %Q %n ">
              <block varName="index" varScope="local"/>
              <blockarg val="=="/>
              <blockarg val="-1"/>
            </block>
            <stack>
              <block spec="comment: %s">
                <blockarg val="first time for this avatar"/>
              </block>
              <block spec=" %S msg: %s on channel %n">
                <blockarg val="Whisper"/>
                <block spec=" %n %P %n ">
                  <block fCallArgSpec="sayTimeOfDay()" funcName="sayTimeOfDay" numArgs="0"/>
                  <blockarg val="+"/>
                  <block spec=" %n %P %n ">
                    <block varName="gGreetingFirst" varScope="global"/>
                    <blockarg val="+"/>
                    <block spec=" %n %P %n ">
                      <block varName="visitor" varScope="local"/>
                      <blockarg val="+"/>
                      <blockarg val="&quot;.&quot;"/>
                    </block>
                  </block>
                </block>
                <blockarg val="0"/>
              </block>
              <block spec="%s %o %n">
                <block varName="gRecentVisitors" varScope="global"/>
                <blockarg val="+="/>
                <block varName="visitor" varScope="local"/>
              </block>
            </stack>
            <stack>
              <block spec="comment: %s">
                <blockarg val="we saw this avatar recently"/>
              </block>
              <block spec="if %b">
                <block varName="gBeChatty" varScope="global"/>
                <stack>
                  <block spec=" %S msg: %s on channel %n">
                    <blockarg val="Whisper"/>
                    <block spec=" %n %P %n ">
                      <block fCallArgSpec="sayTimeOfDay()" funcName="sayTimeOfDay" numArgs="0"/>
                      <blockarg val="+"/>
                      <block spec=" %n %P %n ">
                        <block varName="gGreetingReturn" varScope="global"/>
                        <blockarg val="+"/>
                        <block spec=" %n %P %n ">
                          <block varName="visitor" varScope="local"/>
                          <blockarg val="+"/>
                          <blockarg val="&quot;.&quot;"/>
                        </block>
                      </block>
                    </block>
                    <blockarg val="0"/>
                  </block>
                </stack>
              </block>
            </stack>
          </block>
          <block spec="if %b">
            <block spec=" %n %Q %n ">
              <block spec="length of list: %s">
                <block varName="gRecentVisitors" varScope="global"/>
              </block>
              <blockarg val=">"/>
              <block varName="MEMORY_LENGTH" varScope="global"/>
            </block>
            <stack>
              <block spec="comment: %s">
                <blockarg val="make a little room - note: SYW listing 5.8 (pg. 138) has an error here"/>
              </block>
              <block spec="set %s = %n">
                <block varName="gRecentVisitors" varScope="global"/>
                <block spec="list %s with items %n to %n deleted">
                  <block varName="gRecentVisitors" varScope="global"/>
                  <blockarg val="0"/>
                  <blockarg val="1"/>
                </block>
              </block>
            </stack>
          </block>
        </stack>
      </stacks>
    </state>
  </states>
</program>