2013-02-16 25 views
8
?

Chcę zaimplementować następujące słowa: VALUE i TO na RPC/8 (emulowany komputer w Minecraftmod). Moje najlepsze próby dają mi zestaw słów, które działają dobrze, o ile nie używam ich podczas kompilacji. Bardziej specyficznie VALUE działa, ale TO nie.Jak zdefiniować wartości VALUE i TO

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

Próbowałem wszystkiego można myślę, aby to pracę i moja najlepsza próba mnie dostaje to:

['] NameOfAValue + 3 ! 

Zauważ, że procesor nie jest czystym 6502 ale 65EL02 wariant zwyczaj z 65816.

EDIT # 1: Jakoś zapomniał wezwanie do tworzenia wartości. Powinien tam być cały czas. EDYCJA # 2: Dostałem również 3 i + zmieniono w TO ... oops. Powinno to być zupełnie odwrotnie.

+8

Cholibka. Pytanie o FORTH działające na emulowanej architekturze komputera na emulowanym wariancie wariantu 6502 wewnątrz gry. Nie mogę na nie odpowiedzieć, ale +1 tylko dla meta-meta-jej wartości! –

+0

@Jonners Minecraft (na PC) jest napisany w Javie, więc wszystko to działa również na maszynie wirtualnej. – sheepez

+0

@Milo; Kod wymieniony tutaj dla TO jest nadal błędny Milo. ! jest (n -) nie (n a -). TO próbuje zapisać niedomiar na stosie pod adresem 3. Musi to być ': TO (n) '3 +!' –

Odpowiedz

2

Ok Po wiele prób i błędów, a także wielu poszukiwaniach znalazłem coś, co powinno działać, ale ze względu na dwa błędy w redFORTH, nie.

WARTOŚĆ

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

DO

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

demo błąd w dosłownym

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

Demo bug w odłożyć

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

Mam zamiar złożyć raport o błędzie ....

EDYCJA # 1: po kilku próbach i błędach, a nie przysięganiu (nie jestem dobry w FORTH) znalazłem sposób na zrobienie tego praca.

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

Dodano obejście odpowiedzi. –

0

Nie jestem pewien, w jaki sposób Forth uchwyty interpretacji kontra czasie kompilacji, ale definicja TO próbuje zapisać wartość do zajęcia 3. Wydaje się podejrzany.

+0

3 jest przesunięciem od xt, gdzie wartość utworzona przez CREATE jest. Znalazłem to poprzez eksperymentowanie, szkoda, że ​​nie ma słowa zdefiniowanego, aby uzyskać to przesunięcie w przenośny sposób (w redFORTH, jest w innych czwartych) –

+0

Milo, przepraszam, ale kolejność słów jest zła. Spróbuj "słowo 3 +! –

+0

Usprawiedliwić podwójny post, zajęło to więcej niż 5 minut, aby znaleźć sztuczkę formatowania kodu dla komentarzy. Backtick, należy się domyślić.Ten komentarz powyżej powinien brzmieć ... Milo, przepraszam, ale kolejność słów wygląda źle. Wypróbuj ''słowo 3 +!' To, co widzę w twojej definicji TO; zaznacz słowo, dodaj, co jeszcze było na stosie, zapisz tę wartość pod adresem 3. –

0

Najprostszym rozwiązaniem jest

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

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