По мотивам темыПредложение по расширению каркаса BlackBoxсоздал несколько модулей:
StdlibObjects - модуль базового объекта, унаследованного от Stores.Store.StdlibLists - модуль поддержки динамических массивов с произвольным базовым типом.StdlibMem - набор процедур для низкоуровневой работы с памятью.Их, конечно, планируется расширять, так как они сейчас являются пробной версией.

Привожу пример программы с использованием динамического массива.
## Код:
```
MODULE TestLists;

   IMPORT Kernel, O := StdlibObjects, StdlibLists, Log := StdLog;

   TYPE
      MyList = POINTER TO RECORD (StdlibLists.List) END;
      
      MyObject = POINTER TO RECORD (O.Object)
         data: INTEGER;
      END;
      
      PROCEDURE (L: MyList) CompareItems (Index1, Index2: INTEGER): INTEGER;
         VAR object1, object2: MyObject; obj1, obj2: O.Object;
      BEGIN
         obj1 := L.Get(Index1); object1 := obj1(MyObject);
         obj2 := L.Get(Index2); object2 := obj2(MyObject);
         IF object1.data > object2.data THEN
            RETURN 1
         ELSIF object1.data < object2.data THEN
            RETURN -1
         ELSE
            RETURN 0
         END
      END CompareItems;
   
   PROCEDURE NewList (): MyList;
      VAR list: MyList;
   BEGIN
      NEW(list); list.Init;
      RETURN list
   END NewList;
   
   PROCEDURE NewObject (): MyObject;
      VAR object: MyObject;
   BEGIN
      NEW(object);
      RETURN object
   END NewObject;
   
   PROCEDURE AddItems (VAR L: MyList);
      VAR
         myObj: MyObject;
         counter: INTEGER;
         i, j: INTEGER;
   BEGIN
      counter := 0;
      FOR j := 1 TO 10 DO
         INC(counter);
         myObj := NewObject(); 
         myObj.data := counter*counter;
         IF ODD(counter) THEN myObj.data := -myObj.data END;
         i := L.Add(myObj);
      END;
   END AddItems;

   PROCEDURE Print (L: MyList);
      VAR j: INTEGER; o: O.Object; myObj: MyObject;
   BEGIN
      Log.Ln;
      FOR j := 0 TO L.Count - 1 DO
         o := L.Get(j); myObj := o(MyObject); (* get object and assign its pointer to descedant object *)
         Log.Int(myObj.data); Log.Ln
      END;
   END Print;
   
   PROCEDURE Do*;
      VAR
         mylist: MyList;
   BEGIN
      mylist := NewList();
      mylist.SetCapacity(12);
      
      (* Add 10 objects *)
      AddItems (mylist);
      
      (* Printing data of stored objects *)
      Print (mylist);
      
      (* Sort objects *)
      mylist.Sort;
      
      (* Printing data of stored objects *)
      Print (mylist);
   END Do;
   
END TestLists.

^Q TestLists.Do
```


Желающие опробовать, могут скачать Stdlib.
Вложение:Stdlib.zip[16.69 КБ]
Скачиваний: 362


Приветствуются комментарии и конструктивные замечания.