Как стать автором
Обновить

Комментарии 5

Небольших поясняющих примеров кода в статье очень не хватает.
НЛО прилетело и опубликовало эту надпись здесь

Да, Modula-3 был создан, как раз, тогда. В язык и позже вносились изменения, возможно, относительно давно.

Но сама экосистема и компилятор активно развиваются "прямо сейчас".

Пример с ELSIF и ( см."VAR j") объявлением переменной "по месту" в стиле Ada ( это же с WITH в примере с Heapsort) :

PROCEDURE GetData (alg: T) RAISES {Thread.Alerted} =
  VAR
    rand := NEW (Random.Default).init ();
  BEGIN
    WITH a = alg.a, N = alg.N, input = alg.data DO 
      N := FormsVBT.GetInteger(input, "data");
      IF FormsVBT.GetBoolean(input, "increasing") THEN
        FOR i := 1 TO N DO a[i] := i; END;
      ELSIF FormsVBT.GetBoolean(input, "decreasing") THEN
        FOR i := 1 TO N DO a[i] := N - i + 1; END;
      ELSE
        FOR i := 1 TO N DO alg.a[i] := i; END;
        FOR i := N TO 2 BY -1 DO
          VAR j := rand.integer (1, i); t := a[i]; 
          BEGIN a[i] := a[j]; a[j] := t; END;
        END;
      END;
      a[0] := 0;
      a[N + 1] := N + 1;
      SortIE.Init(alg, N, alg.passes());
      FOR i := 1 TO N DO SortIE.SetVal(alg, i, a[i]); END;
    END
  END GetData;

Вложенные процедуры, LOOP + EXIT, FOR с "STEP -1", исключения ( RAISES):

(*****************************  Heapsort  *****************************)

PROCEDURE HeapNew (): Algorithm.T =
  BEGIN
    RETURN NEW(
             HeapSort,
             defaultN := 400,
             data := ZeusPanel.NewForm("SortData.fv")).init()
  END HeapNew;

PROCEDURE HeapPasses (alg: HeapSort): CARDINAL =
  BEGIN
    RETURN alg.N + alg.N DIV 2
  END HeapPasses;

PROCEDURE HeapRun (alg: HeapSort) RAISES {Thread.Alerted} =
  VAR H: INTEGER;

  PROCEDURE SiftDown (k: CARDINAL) RAISES {Thread.Alerted} =
    VAR j: CARDINAL; v: Sort.Key;
    BEGIN
      WITH a = alg.a DO
        v := a[k];
        LOOP
          IF (k > H DIV 2) THEN EXIT; END;
          j := k + k;
          IF (j < H) THEN
            IF a[j] < a[j + 1] THEN j := j + 1; END;
          END;
          IF v >= a[j] THEN EXIT; END;
          SetVal(alg, k, a[j]);
          k := j;
        END;
        SetVal(alg, k, v);
      END
    END SiftDown;

BEGIN 
  GetData (alg);
  WITH N = alg.N DO
    H := N;
    FOR k := N DIV 2 TO 1 BY -1 DO 
      SortIE.StartPass(alg); 
      SiftDown(k); 
    END;
    ZeusPanel.Pause(alg, "Heap made; ready to sort...");
    FOR k := N TO 2 BY -1 DO
      SortIE.StartPass(alg); 
      SwapElts(alg, 1, H);
      H := H - 1;
      SiftDown(1);
    END;
  END 
END HeapRun;
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации