Ich bin neu in Sachen Racket / Schema, also habe ich beschlossen, einen Emulator für die DCPU-16 , ein einfacher 16-Bit-Prozessor.
Meine Frage lautet also: Was ist eine bessere Möglichkeit, meine Lösung zu implementieren?
Dies ist die Lösung, die ich gehackt habe, um die CPU-Register zu steuern. Der Hauptpunkt war, dass Funktionen, die ein Register modifizieren, miteinander verkettet werden können. Zum Beispiel:
%Vor%Der vollständige Text meiner Registerlösung ist unten. Mein vollständiges Programm befindet sich auch auf github. Es gibt so viel wiederholte Logik, ich weiß, dass es einen einfacheren Weg geben muss:
%Vor%Aktualisierung:
Dank Oobviats Suggestionen habe ich die Liste umstrukturiert. Der einzige schwierige Teil bestand darin, einen Wert in der Liste zu aktualisieren. Ich schrieb eine Prozedur für Map, die das gewünschte Register aktualisieren und die anderen mit ihrem ursprünglichen Wert belassen würde:
%Vor%Dies wurde nicht in Racket geschrieben, daher wird es möglicherweise nicht für Sie ausgeführt. Wenn es Fehler auslöst, versuchen Sie, den R5RS-Codetyp am Anfang der Datei anzugeben. Der Einfachheit halber würde ich etwas ähnliches tun, indem ich eine a-Liste anstelle von Strukturen verwende.
%Vor% Ich gehe davon aus, dass Racket wie assoc
eingebaut ist und die richtige Liste aus der a-Liste zurückgibt. Beachten Sie auch, dass *reg*
in diesem Fall als globale Variable definiert ist, so dass wir sie einfach einmal definieren und dann set-cdr!
verwenden können, um Werte zu schreiben.
Schließlich könnte dies Ihrem SP
-Register seltsame Dinge zufügen. Mein Schema sieht es als 65536. Wenn das nicht stimmt, müssen Sie möglicherweise if
zu reg-write
und reg-read
hinzufügen, um sicherzustellen, dass Sie dort die richtigen Werte erhalten.
<EDIT>
Also, ich lese etwas über Racket-Prozeduren, und dieser Code wird fast sicher nicht in normalen Rackets laufen, weil sie anscheinend sowohl veränderbare als auch nicht-veränderbare Paare haben. Die Änderungen, die Sie vornehmen müssen, wenn Sie dies unter Racket und nicht R5RS ausführen möchten, sind wie folgt:
Anstatt nur eine Liste in Anführungszeichen zu verwenden, müssen Sie wahrscheinlich Ihre Liste von Registern mit den Konstruktoren für austauschbare Listen / Paare (define *reg* (mlist (mcons 'A 0) (mcons 'B 0) ... )
erstellen.
Anstatt set-cdr!
zu verwenden, ist die Racket-Version set-mcdr!
und funktioniert nur mit veränderbaren Paaren. </EDIT>