Как мне создать базовый класс и экземпляр этого класса в Forth?

#class #oop #object #forth #gforth

#класс #ооп #объект #далее #gforth

Вопрос:

Я хотел бы создать объект для представления некоторых электрических показаний, таких как входное напряжение. Для этого я хочу создать базовую структуру класса для обработки различных типов показаний — скажем, тока, а также напряжения.

Псевдокод (ну, на самом деле Python) для того, что я хочу сделать, это:

 # Create base class as a subclass of a common class to all other classes
class PowerReading(object):
    # Defining word to  initialize instance variables using the given input
    def __init__(self, current_value, units):
        # instance variables 
        self.value = current_value
        self.units = units

# Define new class based on our generic class above
class Voltage(PowerReading):
    # Call the parent class word with an input value, and constant units string 
    def __init__(self, current_value):
        super(Voltage, self).__init__(current_value, 'volts')

# Create another class based on the same parent class as Voltage 
class Current(PowerReading):
    def __init__(self, current_value):
        # Call the parent word with current units
        super(Voltage, self).__init__(current_value, 'amps')

# input_voltage_atod() is defined elsewhere: gives an instant reading
# from the ATOD pin on the power input rail, already converted to units of volts.

# Create instance object variable using our new Voltage class. 
input_voltage = Voltage(input_voltage_atod())
# Use the object's instance variables
print input_voltage.value, input_voltage.units
# 3.25 volts
  

Я использую Gforth и oof.fs расширение.

Ответ №1:

С помощью нескольких простых символов gforth:

 : symbol ( "name" -- )
  create lastxt , does> ( -- xt ) @ ;
: .symbol ( xt -- )
  >name name>string 1 /string type ;

symbol 'volts
symbol 'amps
  

Вот oof.fs эквивалент вашего Python:

 require oof.fs

object class power-reading
  float var value
  cell var units
  method .
how:
  : init ( r-value units -- )  units !  value f! ;
  : . ( -- ) value f@ f.  units @ .symbol space ;
class;

power-reading class voltage
how:
  : init ( r-value -- )  'volts super init ;
class;

power-reading class current
how:
  : init ( r-value -- )  'amps super init ;
class;

3.25e voltage : input-voltage
input-voltage .   Output: 3.25 volts
  

Это очень похоже, не так ли?

В наши дни я использую mini-oof2.fs, уровень которого намного ниже, чем oof.fs, и который делает намного меньше. В этом:

 object class
  ffield: value
  field: units
  method init ( value units -- )
  method show ( -- )
end-class power-reading

[: ( r-value units -- )  units !  value f! ;] power-reading to init
[: ( -- ) value f@ f.  units @ .symbol space ;] power-reading to show

power-reading class
end-class voltage

[: ( r-value -- )  value f! 'volts units ! ;] voltage to init

power-reading class
end-class current

[: ( r-value -- )  value f! 'amps units ! ;] current to init

voltage new constant input-voltage
3.25e input-voltage .init
input-voltage .show   Output: 3.25 volts
  

Синтаксис [: ... ;] mini-oof2.fs не является специальным. Это просто
цитаты gforth, используемые здесь как синонимы :NONAME .

Макрос .init и .show -развернуть (вроде) в >o init o> и >o show o> , соответственно.

Вместо того, чтобы использовать метод INIT, у меня часто есть не-OO слово, которое создает объект:

 : >current ( r -- o )
  current new >o  value f!  'amps units !  o o> ;
: current, ( r -- )
  here >o [ current >osize @ ]L allot  value f!  'amps units !  o> ;
  

Но, конечно, это не так хорошо работает со сложной ориентацией объекта
, суперметодами и тому подобным. Это 90% решение в отличие от 100%
OO-решения, предоставляемые oof.fs и SWOOP и FMS.

Комментарии:

1. Крутой ответ! oof.fs Пример работает безупречно и делает именно то, что я ищу. Использование символов gforth тоже приятно. Я ценю mini-oof2.fs пример, но я не могу заставить [: ... ;] синтаксис работать ( :10: Undefined word, >>>[:<<<... ) . Эти синонимы вы определили или встроили в gforth? К вашему сведению, я использовал require mini-oof.fs ( require mini-oof2.fs отследить).

2. @CivFan, они встроены и предоставляются по умолчанию, но для их использования может потребоваться более новая версия gforth. Я использую gforth на Android, который является своего рода передовым. mini-oof.fs определенно не будет работать с этим кодом: например, он не использует >o o o> и friends .