В продолжение темы:
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
При этом контейнеры могут находиться как в памяти, так и читаться из "потока".
На этом механизме построена частичная индексация текстов.
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
При этом контейнеры могут находиться как в памяти, так и читаться из "потока".
На этом механизме построена частичная индексация текстов.
Это на каком языке? Та скриптовая машина? Выглядит хорошо.
ОтветитьУдалитьЭто собственные скрипты. Вокруг forth-подобной машины. Но такой же функционал доступен и в коде на Delphi.
УдалитьА что с типизацией? Какой тип у элементов? Коллекции полиморфны?
УдалитьВ Delphi статическая типизация.
УдалитьВ скриптах есть и полиморфные и и изоморфные контейнеры.
Есть ещё множества (сортированные контейнеры):
Удалитьset:[ 1 2 1 ] == set:[ 1 2 ]
- контейнеры сортируются. Дубликаты выкидываются.
Ещё можно ЯВНО задать тип элемента контейнера:
ОтветитьУдалитьInteger [ 1 2 3 ] - массив целых
String [ '1' '2' '3' ] - массив строк
Integer set:[ 1 2 3 1 ] == set:[ 1 2 3 ] - множество целых
ОтветитьУдалитьString set:[ '1' '2' '3' '1' ] == set:[ '1' '2' '3' ] - множество строк
Или:
УдалитьSet Of Integer Var S = set:[ 1 2 3 1 ]
S == set:[ 1 2 3 ] == true