2013-02-16 7 views
8

Ich möchte die Forth-Wörter VALUE und TO auf einem RPC/8 implementieren (ein emulierter Computer in einem Minecraftmod). Meine besten Versuche bringen mir eine Reihe von Wörtern, die gut funktionieren, solange ich sie beim Kompilieren nicht verwende. Weitere VALUE funktioniert, aber TO nicht.So definieren Sie VALUE und TO

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

Ich habe alles versucht, ich denken kann, um es zu arbeiten und mein Bestes versuchen wird mir dies:

['] NameOfAValue + 3 ! 

Beachten Sie, dass der Prozessor kein reines 6502 ist aber ein 65EL02, eine benutzerdefinierte Variante der 65816.

EDIT # 1: Irgendwie habe ich den Aufruf an CREATE in Wert vergessen. Es sollte die ganze Zeit dort gewesen sein. EDIT # 2: Ich habe auch 3 und + in TO umgeschaltet ... oops. Es hätte die ganze Zeit anders sein müssen.

+8

Blimey. Eine Frage zu FORTH läuft auf einer emulierten Computerarchitektur auf einer emulierten Variante einer Variante eines 6502 in einem Spiel. Ich kann es nicht beantworten, aber +1 nur für die Meta-Meta-it! –

+0

@Jonners Minecraft (für den PC) ist in Java geschrieben, also läuft das alles auch in einer virtuellen Maschine. – sheepez

+0

@Milo; Der Code hier für TO ist immer noch falsch Milo. ! ist (a n -) nicht (na -). TO versucht, einen Stack-Unterlauf zu Adresse 3 zu speichern. Es muss sein: TO (n) '3 +! ' –

Antwort

2

Ok Nach viel Versuch und Irrtum sowie viel Suche fand ich etwas, das funktionieren sollte, aber wegen zwei Bugs in redFORTH, nicht.

VALUE

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

TO

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

Demo von Fehlern in WÖRTLICHE

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

Demo von Fehlern in POSTPONE

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

Ich bin dran, einen Fehlerbericht zu schreiben ....

EDIT # 1: Nach etwas mehr Versuch und Irrtum und nicht ein wenig Fluchen (ich bin nicht gut mit FORTH) fand ich einen Weg, es zu machen Arbeit.

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

Der Antwort wurde eine Problemumgehung hinzugefügt. –

0

Ich bin mir nicht sicher, wie Ihr Forth interpretieren im Vergleich zur Kompilierzeit, aber die Definition von TO versucht, einen Wert an Adresse 3 zu speichern. Scheint fischig.

+0

3 ist der Offset von dem xt, wo der von CREATE erzeugte Wert ist. Ich habe das durch eine Experimentierung herausgefunden, schade, dass kein Wort definiert ist, um diesen Offset auf eine tragbare Weise zu erhalten (in redFORTH gibt es in anderen vieren) –

+0

Milo, tut mir leid, aber die Wortstellung ist falsch. Probiere 'Wort 3 +! –

+0

Entschuldigen Sie die doppelte Post, es dauerte länger als 5 Minuten, um den Code-Formatierungstrick für Kommentare zu finden. Backtick, sollte erraten haben.Der obige Kommentar sollte lesen ... Milo, tut mir leid, aber die Wortstellung sieht falsch aus. Probiere '' Wort 3 +! 'Was ich in deiner TO-Definition sehe, ist; ticken Sie ein Wort, fügen Sie alles hinzu, was sich sonst noch auf dem Stapel befand, und speichern Sie diesen Wert auf Adresse 3. –

0

Die einfachste Lösung ist

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

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