среда, 6 ноября 2019 г.

Сделал "абстрактные" контейнеры

В продолжение темы:

https://programmingmindstream.blogspot.com/2019/10/blog-post_5.html?m=1

Сделал "абстрактные" контейнеры.

У которых есть "базовые" абстракции:

1. GetEnumerator - перебор элементов от начала к концу.
2. GetRevertedEnumerator - перебор элементов от конца к началу.
3. CompareItems - функтор сравнения элементов. Вообще говоря - достаточно операции Less (строго меньше). Всё остальное из Less выводится.
4. Sorted - признак сортированности контейнера.

Из этих абстракций выводятся:

1. Enumerable - "фабрика" Enumerator'ов. Она же - "контейнер".
2. Enumerator - енумератор/итератор по элементам. С ответственностими:
 a). MoveNext: Boolean - сместиться к следующему элементу.
 b). Current: ItemType - текущий элемент.

У которых есть:

1. Join - конкатенация над множествами (подобно конкатенации строк):
 [ 1 2 3 ] join [ 1 2 3 ] == [ 1 2 3 1 2 3 ].
 [ 1 2 3 ] join [ 1 2 3 4 ] == [ 1 2 3 1 2 3 4 ].
2. SortedJoin - объединение множеств (дубликаты выкидываются):
 [ 1 2 3 ] sortedJoin [ 1 2 3 ] == [ 1 2 3 ].
 [ 1 2 3 ] sortedJoin [ 1 2 3 4 ] == [ 1 2 3 4 ].
3. Diff - вычитание множеств.
 [ 1 2 3 ] diff [ 2 ] == [ 1 3 ]
4. Intersect - пересечение множеств = комбинация SortedJoin и Diff .
  [ 1 2 3 ] intersect [ 2 ] == [ 2 ]
5. First - первый элемент.
 [ 1 2 3 ] First == 1
6. Last - последний элемент.
 [ 1 2 3 ] Last == 3
7. Empty - пустое ли множество?
8. Count - количество элементов.
 [ 1 2 3 ] join [ 1 2 3 ] == 6
 [ 1 2 3 ] sortedJoin [ 1 2 3 ] == 3
9. Equals - множества эквивалентны?
10. Compare - сравнение множеств - -1, 0, +1.
11. ToTheLeftOf (less) - одно подмножество "левее" другого (строгая операция Less).
 [ 1 2 ] less [ 3 4 ] == true
 [ 3 4 ] less [ 1 2 ] == false
 [ ] less [ 1 2 ] == true
 [ 1 2 ] less [ ] == false
 [ ] less [] == false
 [ 1 ] less [ 1 2 ] == false
 [ 1 2 ] less [ 1 ] == false
12. GetItem - элемент по индексу. В худшем случае - перебор по getEnumerator.
13. Reverted - инверсия:
 [ 1 2 3 ] reverted == [ 3 2 1 ]
14. Fold - свёртка:
 [ [ 1 2 ] [ 3 4 ] ] == [ 1 2 3 4 ]
15. Slice - выделение "пар/троек etc":
 [ 1 2 3 4 ] slice 2 == [ [ 1 2 ] [ 3 4 ] ]
 [ 1 2 3 4 5 6  ] slice 3 == [ [ 1 2 3 ] [ 4 5 6 ] ]
16. Filter - фильтрация:
 [ 1 2 3 4 ] filter IsOdd == [ 1 3 ]
 [ 1 2 3 4 ] filter IsEven == [ 2 4 ]
17. Map - преобразование элемента:
 [ 1 2 3 4 ] map ( + 1 ) == [ 2 3 4 5 ]
 [ 1 2 3 4 ] map ( + 2 ) == [ 3 4 5 6 ]
18. Has - наличие элемента.
 [ 1 2 3 ] has 1 == true
 [ 1 2 3 ] has 5 == false
19. Contains - наличие подмножества.
 [ 1 2 3 ] contains [ 1 ] == true
 [ 1 2 3 ] contains [ 1 2 3 ] == true
 [ 1 2 3 ] contains [ 1 2 3 4 ] == false
 [ 1 2 3 4 ] contains  [ 1 2 3 ] == true
 [ 1 ] contains [ 1 2 3 ] == false
 [] contains [ 1 ] == false
 [ 1 2 3 ] contains [] == true - любое множество ВКЛЮЧАЕТ пустое множество.
20. Intersects: Boolean - множества пересекаются:
 [ 1 2 3 ] intersects [ 1 2 3 ] == true
 [ 1 2 ] intersects [ 1 2 3 ] == true
 [ 1 2 3 ] intersects [ 1 2 ] == true
 [ 1 2 3 ] intersects [ 4 5 7 ] == false
 [ 1 ] intersects [ 2 ] == false

При этом контейнеры могут находиться как в памяти, так и читаться из "потока".

На этом механизме построена частичная индексация текстов.

8 комментариев:

  1. Это на каком языке? Та скриптовая машина? Выглядит хорошо.

    ОтветитьУдалить
    Ответы
    1. Это собственные скрипты. Вокруг forth-подобной машины. Но такой же функционал доступен и в коде на Delphi.

      Удалить
    2. А что с типизацией? Какой тип у элементов? Коллекции полиморфны?

      Удалить
    3. В Delphi статическая типизация.
      В скриптах есть и полиморфные и и изоморфные контейнеры.

      Удалить
    4. Есть ещё множества (сортированные контейнеры):

      set:[ 1 2 1 ] == set:[ 1 2 ]

      - контейнеры сортируются. Дубликаты выкидываются.

      Удалить
  2. Ещё можно ЯВНО задать тип элемента контейнера:

    Integer [ 1 2 3 ] - массив целых
    String [ '1' '2' '3' ] - массив строк

    ОтветитьУдалить
  3. Integer set:[ 1 2 3 1 ] == set:[ 1 2 3 ] - множество целых
    String set:[ '1' '2' '3' '1' ] == set:[ '1' '2' '3' ] - множество строк

    ОтветитьУдалить