10

我想在 RPC/8( Minecraft mod中的模拟计算机)VALUE上实现 Forth 单词。只要我在编译时不使用它们,我的最佳尝试就会让我得到一组可以正常工作的单词。更具体地工作,但没有。TO VALUETO

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

我已经尝试了我能想到的一切来让它工作,我最好的尝试让我做到了:

['] NameOfAValue 3 + !

请注意,处理器不是纯 6502,而是65EL02,65816的自定义变

编辑#1:不知何故,我忘记了对 CREATE 的调用。它应该一直在那里。编辑#2:我也得到3+切换到...哎呀。它应该一直是相反的方式。

4

3 回答 3

3

最简单的解决方案是

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

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

它仅使用 CORE 单词,并且绝对是标准的。而且它只在解释和编译模式下工作,因为在输入流中没有可疑的前瞻。

于 2015-02-09T22:57:48.437 回答
2

好的 经过大量的试验和错误以及大量搜索后,我发现了一些应该可以工作的东西,但是由于 redFORTH 中的两个错误,没有。

价值

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

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

LITERAL 中的错误演示

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

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
于 2013-02-20T22:26:16.657 回答
0

我不确定您的 Forth 如何处理解释时间和编译时间,但 TO 的定义试图将值存储到地址 3。似乎很可疑。

于 2013-02-20T20:01:54.687 回答