Мой ответ "Чемберлену" ( day, 1001)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(Заметки по поводу реализации ООП для SP-Forth'a)

Здесь я не собираюсь ни с кем дискутировать. Просто делюсь своим опытом.
Последней каплей послужило то, что наконец-то дошли руки до
портирования собственной реализации классов в SP-Forth.

После того как мне приглянулись классы C++ (Turbo C++), я начал подумывать
о их реализации в Форте (для точности - InfoForth, немного переделанный
мною для нужд SCADA). Но полный объём мне был не нужен (все эти private,
public, protected, friend etc., на мой взгляд, бесполезная дребедень,
особенно, если это касается Форта. А нужно мне было следующее: структура
(данные) + методы + наследование + полиморфизм. Всё это было реализовано и
уместилось в 1.5 кб кода. За основу взят VOCABULARY и возможность
связывать эти словарики в иерархические списки. Словарная статья
словарика для класса расширена структурой, в которой хранится размер
экземпляра, адреса конструктора и деструктора, адрес VMT и её размер.
Поля структуры экземпляра и методы имеют по 2 CFA. 1 - для обращения
изнутри методов класса, а 2 - для обращения снаружи. Во втором случае на
стеке должен лежать адрес экземпляра. При входе в метод адрес экземпляра
запоминается в специальной USER переменной, значение которой
предварительно сохраняется на стеке возвратов. При выходе значение
восстанавливается. Для виртуальных методов словарная статья создается один 
раз. Она также имеет 2 CFA, а также смещение в VMT. У каждого класса есть
своя VMT. Кроме того, есть сборка мусора.
Если интересны подробности, смотрите файл class.scr.txt

Теперь о делах недавних дней.

Под SP-Forth пишу программы уже больше года и постоянно ощущаю нехватку
адекватной реализации ООP. Всё то, что так или иначе попадалось мне на
глаза,  было, мягко говоря, не очень подходяще для Форта. Это конечно
круто, что в Форте можно реализовать и то и это с любой степень
идентичности. Я каждый раз радовался, когда ко мне попадало очередное чьё-то
детище, но радость быстро угасала по мере того, как я начинал изучать
его и им пользоваться. Твоя реализация, day, наверное, самая лучшая из
всех реализаций такого рода, но слишком велико это всё. Микроклассы - это
уже теплее. И самое главное - очень похоже на то, что я ваял четыре года
назад. Нынешняя моя реализация немного причесана под mc. Но полного
совпадения синтаксиса все же нет.

О деталях версии 1 и 2. 
Основные идеи остались прежними (см. выше)

1. SEARCH-WORDLIST.
    Устройство этого слова долго не позволяло мне портировать 
    классы. Уже давно я ломаю голову над тем, как можно осуществить
    видимость определений родительских классов без переделки этого слова,
    но ничего лучшего, чем переписывание этого слова я так и не придумал.
    Все остальные методы либо громоздки, либо просты, но требуют много
    последующей ручной работы.
    Для связи словарей в иерархический список используется поле CLASS в
    описании WORDLIST'а. Для меня пока остается не очень ясным, для чего
    Черезов собирался или собирается это поле использовать. Но пока оно
    свободно и в него-то и записывается WID родительского словаря (класса).
    Слово SEARCH-WORDLIST переделано таким образом, что, если поиск в
    данном списке оказался неудачным, то делается попытка продолжить его в 
    в списке родительского словаря.
    В файле search-wordlist.f - низкоуровневая переделка,
    а в high-level-search-wordlist.f - соответсвенно, высокоуровневая
    (это для тех, кто ассемблер грузить не хочет). Последняя работает в 5
    раз медленнее первой.
2. Вытекает из первого. Портируемость такой реализации равна нулю. Но к
    этому я не сильно и стремился.
3. От виртуальных методов отказался напрочь. Не стоят они того, что бы их
    специально реализовывать. В Форте нечто подобное можно сделать или с
    помощью специальных полей в структуре экземпляра, которые будут при
    создании экземпляра инициализироваться CFA соответствующих слов, 
    или так, как это у меня сделано в примере (test.f). Возможно, есть и
    другие способы осуществления полиморфизма.
4. Размер экземпляра хранится в переменной size. Для каждого класса
   создается своя переменная.

Что еще написать? И так много настрочил - на меня это не похоже.
Смотрите файл class.f
