{{{  comments
; :-)
; try it
}}}
@if-using not(TOWERS)
  @use (TOWERS)
  {{{  libs
  {{{F fun/error
  :::F fun/error
  }}}
  }}}
  {{{  vars
  ( defvar
     ( tower-height
       tower-move
       delay-time
     )
  )
  }}}
  {{{  towers of hanoi
  {{{  move towers
  {{{  delay
  ( deffun delay ( end-of-line show-cursor delay-time ) )
  }}}
  (defmac move-towers (
    if not(counter-0 tower-height) (
      set-counter tower-height +(tower-height -1)
      {{{  handle cases
      if counter-0 tower-move
        {{{  0=1->2
        (
        set-counter tower-move 1
        move-towers
        end-of-line
        delete-previous-character
        next-line
        end-of-line
        undo-delete-character
        previous-line
        delay
        set-counter tower-move 5
        move-towers
        )
        }}}
      else (
        set-counter tower-move +(tower-move -1)
        if counter-0 tower-move
          {{{  1=1->3
          (
          set-counter tower-move 0
          move-towers
          end-of-line
          delete-previous-character
          next-line
          next-line
          end-of-line
          undo-delete-character
          previous-line
          previous-line
          delay
          set-counter tower-move 3
          move-towers
          )
          }}}
        else (
          set-counter tower-move +(tower-move -1)
          if counter-0 tower-move
            {{{  2=2->1
            (
            set-counter tower-move 3
            move-towers
            next-line
            end-of-line
            delete-previous-character
            previous-line
            end-of-line
            undo-delete-character
            delay
            set-counter tower-move 4
            move-towers
            )
            }}}
          else (
            set-counter tower-move +(tower-move -1)
            if counter-0 tower-move
              {{{  3=2->3
              (
              set-counter tower-move 2
              move-towers
              next-line
              end-of-line
              delete-previous-character
              next-line
              end-of-line
              undo-delete-character
              previous-line
              previous-line
              delay
              set-counter tower-move 1
              move-towers
              )
              }}}
            else (
              set-counter tower-move +(tower-move -1)
              if counter-0 tower-move
                {{{  4=3->1
                (
                set-counter tower-move 5
                move-towers
                next-line
                next-line
                end-of-line
                delete-previous-character
                previous-line
                previous-line
                end-of-line
                undo-delete-character
                delay
                set-counter tower-move 2
                move-towers
                )
                }}}
              else
                {{{  5=3->2
                (
                set-counter tower-move 4
                move-towers
                next-line
                next-line
                end-of-line
                delete-previous-character
                previous-line
                end-of-line
                undo-delete-character
                previous-line
                delay
                set-counter tower-move 0
                move-towers
                )
                }}}
              fi
            )
            fi
          )
          fi
        )
        fi
      ) fi
      }}}
      set-counter tower-height +(tower-height 1)
    ) fi
  ))
  }}}
  (deffun towers-of-hanoi (
    if not(test-text) ( failed ) fi
    beginning-of-line
    newline-and-indent
    previous-line
    "I "  "play "  "the "  "towers "  "of  "  "hanoi
    newline-and-indent
    "==========================
    next-line
    beginning-of-line
    set-counter tower-height 0
    set-counter tower-move   0
    while not(test-end-line)
     ( forward-character set-counter tower-height +(tower-height 1) )
    case
     ( counter>0 -(tower-height 8) ( set-counter delay-time 0 ) )
     ( counter>0 -(tower-height 6) ( set-counter delay-time 1 ) )
     ( counter>0 -(tower-height 4) ( set-counter delay-time 2 ) )
    default
     ( set-counter delay-time 7 )
    esac
    beginning-of-line
    "tower "  "1|
    end-of-line
    newline-and-indent
    "tower "  "2|
    newline-and-indent
    "tower "  "3|
    previous-line
    previous-line
    move-towers
  ))
  }}}
  {{{  undeclare
  ( undeclare ( tower-height tower-move delay move-towers ) )
  }}}
@fi
