Tipps zum Golfen in Forth


10

Welche allgemeinen Tipps haben Sie zum Golfen in Forth (und seinen Klonen)? Ich suche nach Ideen, die auf Code-Golf-Probleme im Allgemeinen angewendet werden können, die zumindest etwas spezifisch für Forth sind (z. B. "Kommentare entfernen" ist keine Antwort).

Antworten:


3

Vermeiden Sie explizite Schleifen um jeden Preis

Forth hat zwei Schleifenkonstrukte, x y do... loopund weniger bekannte [begin]... [until] x ywobei xund yWerte für Grenzwert und Index bzw. zu beachtende Bedingungen sind.

Diese sind sehr langsam, sehr wortreich (haha) und insgesamt eher aufgebläht. Verwenden Sie sie daher nur, wenn Sie dies benötigen.

Stattdessen sollte man wie bei einer richtigen funktionalen Sprache (die Forth eigentlich ist) die Rekursivität gegenüber expliziten Schleifen bevorzugen, da sie tendenziell kürzer ist und die Sprache besser nutzt.


3

Lass den Müll

Programme müssen nicht stapelsicher sein.

Stattdessen können sie zusätzlichen Müll auf dem Stapel belassen, wenn Sie dadurch Bytes sparen. In Forth lässt der "Rückgabewert" etwas oben auf dem Stapel. Es spielt wahrscheinlich keine Rolle, welchen Müll Sie darunter auf dem Stapel haben, es sei denn, Sie verwenden Rekursion und Stapeltiefe.


2

Forth hat viele coole eingebaute Wörter, von denen viele hilfreich sind, um die Arten von Algorithmen zu entwickeln, die in PPCG zu finden sind.

Ein schlechtes, aber anschauliches Beispiel hierfür sind die Wörter für increment ( 1+) und decrement ( 1-). Sie sparen beim Schreiben ein Byte, 1 +um den oberen Rand des Stapels zu erhöhen.

Zusätzlich finden Sie hier eine praktische Liste vieler (wahrscheinlich nicht aller) Wörter, die in modernen Distributionen wie gefunden werden gforth.


1

Beobachten Sie den Stapel

Achten Sie beim Schreiben Ihres Codes darauf, was bei jedem Befehl auf dem Stapel passiert. Normalerweise ziehe ich es heraus, während ich gehe, wie folgt:

6       6
7       7 6
* DUP   42 42

Wie Sie weitergehen, finden Sie es leichter zu erkennen , wenn Sie die Verwendung von Stapeloperationen wie machen kann ROT, -ROT, 2DUP, 2OVER, etc ...


1

Versuchen Sie es mit verschiedenen Doppelzellenwörtern

Dazu gehören Doppel-Zellen - Arithmetik , bitweise , Anzahl Vergleich und Stapelmanipulations Worte. Doppelzellige Ganzzahlliterale zählen ebenfalls.

  • Das Anhängen eines Punkts an ein ganzzahliges Literal (z. B. 1.) ergibt ein Doppelzellenliteral. Für kleine Zahlen bedeutet dies, dass eine zusätzliche Null auf Kosten von nur einem Byte verschoben wird.
  • m+= 0 d+~ = under+(nicht genau, da ein Überlauf auftreten kann.)
  • d2*und d2/könnte verwendet werden, um ein Bit aus einem Wort zu extrahieren / zu pushen.
  • a b c d d= = a c = b d = and
  • a b c d d<> = a c <> b d <> or
  • Worte , die zwei Zahlen auf einmal kopieren, zum Beispiel 2dup, 2over, 2tuckhaben eine gute Chance , lokale Variablen zu gewinnen.

0

(gforth-spezifisch) Verwenden Sie den separaten Gleitkommastapel

gforth hat einen separaten Stapel für Gleitkommazahlen. Selbst wenn Sie nur mit Ganzzahlen arbeiten, kann das Auslagern von Arbeit und Speicher in den FP-Stapel insgesamt zu kürzerem Code führen, indem explizite Stapelmanipulationen vermieden oder FP-spezifische Vorgänge verwendet werden, die auf dem Hauptstapel nicht verfügbar sind. Die Rückkehr zum FP-Stapel ist ebenfalls eine vollkommen gültige Option (außer wenn die Aufgabe darin besteht, einen Booleschen Wert zurückzugeben).

  • FP-bezogenen Operationen (arithmetisches, Stapelmanipulation) in der Regel eine mehr kosten Byte jedes (der fPräfix, wie in f+, fdupetc.). FP-Zahlenliterale kosten auch ein weiteres Byte (Postfix e, wie in 1e), aber einige Zahlen können ein Byte binden oder sogar speichern (z . B. 1e3anstelle von 1000).
  • Einige Operationen fehlen auf dem FP-Stapel, wahrscheinlich das schmerzhafteste Wesen 1+und 1-.
  • Zu den einzigartigen Operationen des FP-Stacks gehören f**(Potenz), falog(Potenz von 10) fsqrtund verschiedene exp-, log- und trigonometriebezogene Operationen .
  • Sie können Zahlen zwischen Haupt- und FP-Stapeln über s>f(einfach zu schweben), f>s(schweben zu einfach), d>f(doppelt zu schweben), f>d(schweben zu verdoppeln) verschieben. Manchmal können die "doppelten" Variationen verwendet werden, um eine zusätzliche Null zu erzeugen oder zu verbrauchen.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.