Antworten:
Forth hat zwei Schleifenkonstrukte, x y do
... loop
und weniger bekannte [begin]
... [until] x y
wobei x
und y
Werte 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.
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.
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
.
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 ...
Dazu gehören Doppel-Zellen - Arithmetik , bitweise , Anzahl Vergleich und Stapelmanipulations Worte. Doppelzellige Ganzzahlliterale zählen ebenfalls.
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
2dup
, 2over
, 2tuck
haben eine gute Chance , lokale Variablen zu gewinnen.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).
f
Präfix, wie in f+
, fdup
etc.). 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. 1e3
anstelle von 1000
).1+
und 1-
.f**
(Potenz), falog
(Potenz von 10) fsqrt
und verschiedene exp-, log- und trigonometriebezogene Operationen .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.