#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 .