А ещё шаблоны можно реализовать на Обероне и без макросов: 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>> и т.п.
У меня такой вопрос:
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;