#!@OOREXX_SHEBANG_PROGRAM@
/*----------------------------------------------------------------------------*/
/*                                                                            */
/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved.             */
/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved.    */
/*                                                                            */
/* This program and the accompanying materials are made available under       */
/* the terms of the Common Public License v1.0 which accompanies this         */
/* distribution. A copy is also available at the following address:           */
/* https://www.oorexx.org/license.html                         */
/*                                                                            */
/* Redistribution and use in source and binary forms, with or                 */
/* without modification, are permitted provided that the following            */
/* conditions are met:                                                        */
/*                                                                            */
/* Redistributions of source code must retain the above copyright             */
/* notice, this list of conditions and the following disclaimer.              */
/* Redistributions in binary form must reproduce the above copyright          */
/* notice, this list of conditions and the following disclaimer in            */
/* the documentation and/or other materials provided with the distribution.   */
/*                                                                            */
/* Neither the name of Rexx Language Association nor the names                */
/* of its contributors may be used to endorse or promote products             */
/* derived from this software without specific prior written permission.      */
/*                                                                            */
/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS        */
/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT          */
/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS          */
/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT   */
/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,      */
/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED   */
/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,        */
/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY     */
/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING    */
/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS         */
/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.               */
/*                                                                            */
/*----------------------------------------------------------------------------*/
/******************************************************************************/
/*  guess.rex           Open Object Rexx Samples                              */
/*                                                                            */
/*  An animal guessing game                                                   */
/*                                                                            */
/*                                                                            */
/* -------------------------------------------------------------------------- */
/*                                                                            */
/*  Description:                                                              */
/*  This samples creates a simple node class and uses it to create a logic    */
/*  tree.  The logic tree is filled in by playing a simple guessing game.     */
/******************************************************************************/
topic = 'animal'

firstNode = .node~new                       /* Create a new instance of node  */
                                            /* to start our tree.             */
firstNode~setGuess('bear')

say 'Think of' article(topic) 'for me to guess!'

do until userQuits
  firstNode~interact                        /* Invoke the interact method on  */
                                            /* the node class to handle user  */
                                            /* interaction.                   */
  userQuits = \prompt('Wanna try another' topic'?')
end

say ''
say 'Here is the decision tree I built:'
firstNode~dump(1)

say 'Thanks for playing!'
return

/* An example of using the ::routine directive to define a subroutine used by */
/* several of the following methods.                                          */
::routine prompt
  use arg question
  say question '(Y/N)'
  pull reply
  return reply = 'Y'

/* An example of using the ::routine directive to define a subroutine used by */
/* several of the following methods.                                          */
::routine article
  use arg noun
  if noun~caselessMatchchar(1, 'AEIOU') then
     return 'an' noun
  else
     return 'a' noun

/* Define a new class 'node' and make it visible outside of this program      */
::class node public

/* Define the init method on the node class.  This method initializes the     */
/* state data for an instance of the node class.                              */
::method init
  expose yesNode noNode myGuess myQuestion
  yesNode = .nil
  noNode = .nil
  myGuess = .nil
  myQuestion = .nil
  return self

/* Define the dump method on the node class.  This method prints out the      */
/* decision tree built by the program.                                        */
::method dump
  expose yesNode noNode myGuess myQuestion
  use arg tab
  if myGuess = .nil then do
    yesNode~dump(tab + 5)
    say left('',tab) myQuestion
    noNode~dump(tab + 5)
  end
  else do
    say left('',tab) '<'myGuess'>'
  end

/* Define the setGuess method on the node class.  This method gets the next   */
/* guess from the user.                                                       */
::method setGuess
  expose myGuess
  use arg myGuess

/* Define the interact method on the node class.  This method handles the     */
/* interaction between the program and the user.  Note the use of 'self' to   */
/* execute methods on this instance of node.                                  */
::method interact
  expose myGuess
  if myGuess = .nil then
    self~askQuestion
  else
    self~guess

/* Define the guess method on the node class.  This method tries to guess the */
/* user's article and asks the user for more information if it fails.         */
::method guess
  expose myGuess
  say "I bet you're thinking of" article(myGuess)'.'
  if prompt('Right?') then
    say 'Cool!  I guessed your secret!'
  else
    self~learnNew

/* Define the learnNew method on the node class.  This method gets additional */
/* information about the user's article.                                      */
::method learnNew
  expose myGuess myQuestion yesNode noNode
  say 'What were you thinking of?'
  parse pull newGuess
  say 'Oops!  I never heard of that.'
  say 'Please enter a question with a yes or no answer that would help me'
  say 'tell' article(myGuess) 'from' article(newGuess)'.'
  parse pull myQuestion
  yesNode = .node~new
  noNode = .node~new
  if prompt('Is the answer yes for' article(newGuess)'?') then do
    yesNode~setGuess(newGuess)
    noNode~setGuess(myGuess)
  end
  else do
    yesNode~setGuess(myGuess)
    noNode~setGuess(newGuess)
  end
  say "Thanks, I'll remember that for next time!"
  myGuess = .nil
  return

/* Define the askQuestion method on the node class.  This method branches     */
/* down either the yes or no fork based on the user's response.               */
::method askQuestion
  expose myQuestion yesNode noNode
  if prompt(myQuestion) then
    yesNode~interact
  else
    noNode~interact