2013-02-16 55 views
8

我想在RPC/8(模擬計算機中的Minecraftmod)上實現Forth單詞VALUETO。我最好的嘗試就是給我一套可以正常工作的單詞,只要我在編譯時不使用它們。更具體地VALUE作品,但TO沒有。如何定義VALUE和TO

: VALUE CREATE , DOES> @ ; 
: TO ' 3 + ! ; 

我已經試過所有我能想到得到它的工作和我的最好的嘗試讓我這個:

['] NameOfAValue + 3 ! 

注意,處理器是不是一個純粹的6502,但一個65EL02,一個自定義的變種的65816

編輯#1:不知怎的,我忘了調用CREATE的值。它應該一直在那裏。 編輯#2:我也有3+切換到...哎呀。它應該一直是其他方式。

+8

啊呀。一個關於FORTH在仿真計算機體系結構上運行的問題,在一個遊戲內部6502變體的仿真變體上運行。我無法回答它,但+1只是爲了它的元元素! – 2013-02-16 23:02:59

+0

@Jonners Minecraft(用於個人電腦)是用Java編寫的,所有這些都在虛擬機中運行。 – sheepez 2013-02-17 21:17:53

+0

@Milo;這裏列出的代碼仍然是錯誤的米洛。 !是(一個n - )不是(n a - )。 TO正試圖存儲一個堆棧下溢地址3.它需要是':TO(n)'3 +!' – 2013-02-25 09:04:01

回答

2

好了經過大量的試驗和錯誤以及大量的搜索後,我發現了一些應該可以工作的東西,但是由於redFORTH中存在兩個錯誤,並沒有。

VALUE

\ Works fine, now to reset the value. 
: VALUE \ n <name> -- 
    CREATE , 
    DOES> @ 
; 

在錯誤的立即

\ fails, very wierd error. 
: TESTLIT [ 42 ] LITERAL ; 
\ TESTLIT Unknown Token: TESTLIT 
\ FORGET TESTLIT Unknown Token: TESTLIT 
\ WORDS TESTLIT COLD SORTMATCH ... 

演示

\ Works if not compiling, LITERAL and POSTPONE are broken. 
: TO 
    TIBWORD FIND 3 + 
    STATE @ IF 
     POSTPONE LITERAL 
     POSTPONE ! 
    ELSE 
     ! 
    THEN 
; IMMEDIATE 

演示錯誤的POSTPONE

\ fails, postpone is directly equivelent to ['] 
: TESTPOST POSTPONE + ; IMMEDIATE 
: TEST 2 2 TESTPOST . ; 
\ . 1935 
\ ' + . 1935 

我要提交錯誤報告....

編輯#1:經過一些更多的試驗和錯誤,並沒有一點髒話(我對FORTH不好),我找到了一種方法使它工作。

: TO 
    TIBWORD FIND 3 + 
    STATE @ IF 
     (lit) (lit) , , \ store address 
     (lit) ! , 
ELSE 
     ! 
    THEN 
; IMMEDIATE 
+0

對答案添加了解決方法。 – 2013-02-25 16:19:31

0

我不確定你的Forth如何處理解釋和編譯時間,但TO的定義是試圖存儲一個值來解決3.似乎可疑。

+0

3是由CREATE創建的值所在的xt的偏移量。我通過實驗發現了這一點,太糟糕了,沒有定義任何詞來以便攜的方式獲得這個偏移量(在redFORTH中,在其他四分之一中) – 2013-02-20 22:16:32

+0

Milo,對不起,但是詞順序是錯誤的。嘗試'字3 +! – 2013-02-21 06:12:56

+0

請原諒雙後,花了超過5分鐘找到代碼格式化技巧的意見。反襯,應該猜對了。上面的評論應該改爲......米羅,對不起,但這個詞順序看起來不對。嘗試''文字3 +!'我在你的TO定義中看到的是;勾選一個詞,在當時添加其他任何內容,將該值存儲到地址3. – 2013-02-21 06:21:01

0

最簡單的解決方案是

VARIABLE TO-MESSAGE \ 0 : FROM , 1 : TO .   
: TO 1 TO-MESSAGE ! ; 

: VALUE CREATE , DOES> TO-MESSAGE @ IF ! ELSE @ THEN 
0 TO_MESSAGE ! ;