Как я могу реализовать классы с неуникальными именами методов в Forth самым простым способом? - PullRequest
0 голосов
/ 15 декабря 2018

Мне нужно было определить набор классов в Forth, где определенные имена методов могут повторяться в разных классах.

Окончательное решение должно работать на простом процессоре J1B в FPGA с Swapforth .Поэтому все должно быть максимально просто.

Поскольку Swapftorth включает в себя mini-oof.fs , я пытался использовать эту библиотеку, но она неправильно обрабатывает неуникальные имена методов.

Приведенный ниже код показывает проблему в Gforth, но в Swapforth он работает так же.Единственное отличие состоит в том, что в Gforth мне пришлось использовать «new» вместо «anew»:

require mini-oof.fs
object class
  method y
  method x
end-class wc1
:noname drop ." method x in wc1" ; wc1 defines x
:noname drop ." method y in wc1" ; wc1 defines y

object class
  method x
  method y
end-class wc2
:noname drop ." method x in wc2" ; wc2 defines x
:noname drop ." method y in wc2" ; wc2 defines y

wc1 new constant xx1
wc2 new constant xx2

Если я загружаю приведенный выше код в Gforth, а затем пытаюсь вызвать методы x и yОбъекты xx1 и xx2, я получаю следующие результаты:

xx1 x method y in wc1 ok
xx1 y method x in wc1 ok
xx2 y method y in wc2 ok
xx2 x method x in wc2 ok

Оказывается, что определение методов "x" и "y" для класса "wc2" повлияло на их определение для класса "wc1".Кажется, что после определения класса wc2 mini-oof просто переводит «x» в первый метод в любом классе и «y» во второй метод в любом классе.

Чтобы проверить эту гипотезу,Я добавил третий класс:

object class
  method m1
  method m2
end-class wc3
:noname drop ." method m1 in wc3" ; wc2 defines m1
:noname drop ." method m2 in wc3" ; wc2 defines m2
wc3 new constant xx3

Действительно, приведенные ниже тесты показывают, что x, y, m1, m2 просто переводятся в номера методов:

xx3 x method m1 in wc2 ok
xx3 y method m2 in wc2 ok
xx3 m1 method m1 in wc2 ok
xx1 m1 method y in wc1 ok

Есть лиеще одна простая библиотека Forth, которая поддерживает классы с неуникальными именами методов?

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

Слишком много реализаций ООП, чтобы протестировать их все в swapforth и указать какой-то конкретный вариант.

В общем случае есть только два варианта:

  1. Известный класс во время компиляции (и возможное раннее связывание).
  2. Неизвестный класс во время компиляции (и позднее связывание).

Следовательно, в случае раннего связывания вам необходимоуказать класс каким-либо образом вместе с методом (вместо вызова метода).

Итак, если вы хотите использовать грамматику, подобную следующей:

xx1  dup >r  x  r> y
xx2  dup >r  y  r> x 

-только варианты позднего связывания.Это приемлемо?

В случае позднего связывания метод будет решен во время выполнения.Реализация может быть основана на стандартных списках слов (поиск происходит только среди методов соответствующего класса) или даже по собственным хеш-таблицам.

В случае раннего связывания либо синтаксический анализ словили следует использовать механизм распознавания лексемы (распознаватели).Пример использования может выглядеть следующим образом:

  • a) ^ - это слово для непосредственного анализа:

    xx1  dup >r  ^ wc1#x   r>  ^ wc1#y
    xx2  dup >r  ^ wc2#y   r>  ^ wc2#x
    
  • b) . - это возможный синтаксис для квалификации методов:

    xx1  dup >r  wc1.x   r>  wc1.y
    xx2  dup >r  wc2.y   r>  wc2.x
    

Таким образом, неквалифицированный вызов метода может использоваться только внутри определения класса.Вне определения класса методы должны быть всегда квалифицированы.

В других типизированных языках метод квалифицируется через идентификатор переменной (так как тип переменной известен заранее).В Forth он должен работать вообще без переменных.

В отсутствие API "список слов" или распознавателя - их можно легко реализовать вместе с внешним циклом интерпретатора.

0 голосов
/ 08 января 2019

Я не могу отвечать на комментарии, но вы предлагаете Мануэлю Родригесу, чтобы вы хотели "методы с одинаковыми именами, которые ведут себя по-разному".Вы можете потенциально использовать списки слов / словари для достижения той же цели.

0 голосов
/ 17 декабря 2018

Возможной альтернативой библиотеке, такой как mini-oof.fs, является использование внутренних функций Forth для сложности обработки, а именно возможность распределения исходного кода по разным файлам.Файл «gui.fs» равен классу gui, в то время как файл «phys.fs» хранит всю физику.В каждом файле переменные и методы определены в обычном синтаксисе Форта, что означает:

variable x
variable y
: getx
: gety

Концепция была описана как «аскетическое программирование» в выступлении на собрании Силиконовой долины в группе интересов Форта.(SVIG): «Сэмюэль А. Фальво II: Последующие мероприятия по расширению ОО считаются вредными, четвертый день ноября 2010 г. Примечания к заседанию»

...