// 2011.04.06 # Doj
// Оператор switch

include" units\statements\locals.de"

// 2 dyn *switch-marks 
// 2 dyn *switch-offsets 

// : switch-marks-top ( -d) *switch-marks dup dyn# 1- swap dyn[]@ ;
// : switch-marks+ ( i) switch-marks-top dyn+ ;
// : switch-local-offset ( -i) *switch-offsets dyn.top ;

: switch ( C: -di) ( R: i-)
  8 dyn-new // *switch-marks dyn+
  // добавляем адрес смещения в массив *switch-offsets
  *local-offset @ // *switch-offsets dyn+
  // увеличиваем переменную *local-offset
  local-offset>>
  // компилируем выделение памяти под локальную переменную
  1 cells postpone literal postpone l+
  // записываем начальное значение в локальную переменную
  ( switch-local-offset) dup postpone literal postpone l!
; immediate

RUS summary начинает объявление оператора switch
detail <inline>( C: -di) ( R: i-) </inline>
  Семантика компиляции
    Создаёт <inline>d</inline> - динамический массив ячеек.
    Кладёт <inline>i</inline> - значение переменной <inline>*local-offset</inline>.
    Увеличивает <inline>*local-offset</inline> на размер ячейки.
  Семантика исполнения
    Выделяет локальную память. Снимает значение со стека, сохраняет его в
    выделенной памяти.
  Пример использования
  <code>
    : test 
      switch
        0 of ." zero" \of
        1 of ." one" \of
        7 of ." seven" \of
        ." unknown"
      \switch
      cr
    ;
  </code>
  См. также <article>of</article> <article>\of</article> <article>\switch</article>
\detail

: of ( di-dim)
  dup postpone literal postpone l@
  postpone =
  postpone ?branch
  >mark
; immediate

RUS summary проверяет на равенство числу со стека значению, снятого при вызове switch
detail ( C: di-dim) ( R: i-)
\detail

: \of ( dim-di)
  rrot
  postpone branch over >mark swap dyn+
  lrot
  >resolve
; immediate

: \switch ( di)
  drop dup dyn# | i| begin i-- while i@ over dyn[]@ >resolve repeat dyn.free
; immediate
