А ещё шаблоны можно реализовать на Обероне и без макросов: http://sage.com.ua/ru.shtml?e1l5
Озвучьте, если я что-то упустил.
А ещё шаблоны можно реализовать на Обероне и без макросов: http://sage.com.ua/ru.shtml?e1l5
Озвучьте, если я что-то упустил.
Код:01 TYPE 01.1 TEMPLATE<CLASS XXX> 02 ListStdItem = POINTER TO RECORD 03 value: XXX; 04 END; Теперь у нас есть все возможные типы ListStdItem<LONGINT>, ListStdItem<DOUBLE>, ListStdItem<STRING>, ListStdItem<ListStdItem<STRING>> и т.п. 05 05.1 TEMPLATE<CLASS XXX> 06 StdList = OBJECT 07 VAR 08 list: List; 09 10 PROCEDURE &New(options: SET); 11 BEGIN 12 NEW(list, Compare, options) 13 END New; 14 15 PROCEDURE Compare(first, second: ANY): LONGINT; 16 VAR 17 nFirst, nSecond: XXX; 18 BEGIN 19 nFirst := first(ListStdItem<XXX>).value; 20 nSecond := second(ListStdItem<XXX>).value; 21 IF nFirst < nSecond THEN 22 RETURN -1 23 ELSIF nFirst > nSecond THEN 24 RETURN 1 25 ELSE 26 RETURN 0 27 END 28 END Compare; 29 30 PROCEDURE Add(x: XXX); 31 VAR 32 item: ListStdItem<XXX>; 33 BEGIN 34 NEW(item); 35 item.value := x; 36 list.Add(item) 37 END Add; 38 39 PROCEDURE Insert(pos: LONGINT; x: XXX); 40 VAR 41 item: ListStdItem<XXX>; 42 BEGIN 43 NEW(item); 44 item.value := x; 45 list.Insert(pos, item) 46 END Insert; 47 48 PROCEDURE Remove(i: LONGINT); 49 BEGIN 50 list.Remove(i) 51 END Remove; 52 53 PROCEDURE IndexOf(x: XXX): LONGINT; 54 VAR 55 item: ListStdItem<XXX>; 56 BEGIN 57 NEW(item); 58 item.value := x; 59 RETURN list.IndexOf(item) 60 END IndexOf; 61 62 PROCEDURE GetCount(): LONGINT; 63 BEGIN 64 RETURN list.GetCount() 65 END GetCount; 66 67 PROCEDURE GetItem(i: LONGINT): XXX; 68 VAR 69 item: ANY; 70 BEGIN 71 item := list.GetItem(i); 72 RETURN item(ListStdItem<XXX>).value 73 END GetItem; 74 75 END LongintList; Теперь у нас есть все возможные типы StdList<LONGINT>, StdList<DOUBLE>, StdList<STRING>, StdList<StdList<STRING>> и т.п.
Последний раз редактировалось vinxru; 15.03.2012 в 13:13.
Лучше сделать и жалеть, чем не сделать и жалеть.
Некоторые из моих поделок тут: https://github.com/serge-404
Граф Дракула наш кумир, патамушта он вомпир!
VKINK 9 : BORDER NOT PI
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
У меня такой вопрос:
1. В конце процедуры, например, "add" есть запись "END Add;", поймёт ли он просто "END;" ?
2. Красным выделю вариант. Меня интересует поймёт ли компилятор ?
3. Как компилятор относится к регистру в тексте ? Могу ли я объявить процедуру Большими символами, а вызывать её маленькими ?Код:PROCEDURE Compare(first, second: ANY): LONGINT; VAR nFirst, nSecond: XXX; BEGIN nFirst := first(ListStdItem<XXX>).value; nSecond := second(ListStdItem<XXX>).value; IF nFirst < nSecond THEN RETURN -1 ELSIF nFirst > nSecond THEN BEGIN RETURN 1; END ELSE BEGIN RETURN 0; END; END Compare;
AAA когда меня режут, я терплю, но когда дополняют, становится нестерпимо.
Лучше сделать и жалеть, чем не сделать и жалеть.
Некоторые из моих поделок тут: https://github.com/serge-404
Граф Дракула наш кумир, патамушта он вомпир!
VKINK 9 : BORDER NOT PI
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)