簡體   English   中英

如何以最簡單的方式在Forth中使用非唯一方法名稱實現類?

[英]How can I implement classes with non-unique method names in Forth in the simplest way?

我需要在Forth中定義一組類,其中某些方法名稱可能在不同的類中重復。

最終的解決方案應在FPGA簡單J1B處理器工作,具有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,然后嘗試調用對象xx1和xx2的x和y方法,則會得到以下結果:

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

看來,類“ wc2”的方法“ x”和“ y”的定義影響了它們對類“ 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庫支持具有非唯一方法名稱的類?

替代mini-oof.fs之類的庫的可能替代方法是利用Forth內部功能來處理復雜性,即能夠將源代碼分發到不同文件中。 文件“ gui.fs”等於類gui,而文件“ physics.fs”存儲所有物理。 在每個文件中,變量和方法均以常規的Forth語法定義,即:

variable x
variable y
: getx
: gety

在硅谷Forth利益集團(SVIG)的一次會議上,該概念被描述為“ Ascetic編程”:“ Samuel A. Falvo II:OO擴展被認為有害,第四天,2010年11月,會議記錄”。

有太多的OOP實現無法在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的情況下,它們可以與外部解釋器循環一起輕松實現。

我無法回復評論,但您向曼努埃爾·羅德里格斯(Manuel Rodriguez)建議,您要“名稱相同但行為不同的方法”。 您可能會使用詞匯表/詞匯表來實現相同的目標。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM