Willkommen bei Factor! Factor ist eine konkatenative Sprache: Statt Funktionen wie square(add(2, 3)) aufzurufen, schreibst du eine Reihe von Wörtern von links nach rechts, etwa 2 3 + square, die Werte über einen gemeinsamen Datenstack weiterreichen. Stell dir einen Stapel Frachtkisten an einem Kai vor, wobei die neueste oben liegt.
Ein ! beginnt einen Zeilenkommentar. Factor ignoriert alles von ! bis zum Ende der Zeile. Die Beispiele unten nutzen !, um zu kommentieren, was der Code tut.
Wenn du ein Literal schreibst, wird es oben auf den Stack gelegt. Code wird von links nach rechts gelesen.
1 2 3 ! stack (bottom → top): 1 2 3
Jedes Wort liest seine Eingabewerte oben vom Stack und schreibt seine Ausgabewerte wieder dorthin zurück. . nimmt den obersten Wert vom Stack und gibt ihn aus; .s gibt den gesamten Stack aus, ohne etwas zu verbrauchen, was praktisch ist, um zu sehen, was ein Codeschnipsel hinterlassen hat.
Jedes Wort ist mit einem Stackeffekt der Form ( inputs -- outputs ) dokumentiert. Er ist der Vertrag des Wortes: Das Wort nimmt die Eingabewerte oben vom Stack und hinterlässt die Ausgabewerte an ihrer Stelle. Die Namen darin sind Dokumentation für Menschen; der Stack selbst ist positional, nicht benannt. Der oberste Wert des Stacks ist der rechte Name.
: beginnt eine Wortdefinition, danach kommt der Stackeffekt, dann der Rumpf, und ; beendet sie. Factors Compiler prüft, dass der Rumpf wirklich das hinterlässt, was der Stackeffekt angibt.
: restow ( a b -- b a ) swap ;
Diese Wörter aus kernel ordnen den oberen Teil des Stacks neu, ohne irgendetwas zu rechnen. Sie bewegen nur Kisten hin und her:
dup ( x -- x x ) ! copy the top crate
drop ( x -- ) ! remove the top crate
swap ( x y -- y x ) ! flip the top two
over ( x y -- x y x ) ! copy the second crate onto the top
nip ( x y -- y ) ! remove the second crate
rot ( x y z -- y z x ) ! roll the third crate up to the top
Greif zu dup, wenn eine Kiste zwei Wörter versorgen muss, zu drop, um eine Kiste wegzuwerfen, zu swap, wenn die obersten zwei in der falschen Reihenfolge liegen, zu over oder nip, um mit der Kiste darunter zu arbeiten, und zu rot, um eine vergrabene Kiste nach oben zu holen.
Die größere Verwandtschaft (-rot, dupd, swapd, 2dup, …) folgt derselben Idee; diese Wörter lernst du später kennen.
Wörter, die in einer Reihe stehen, laufen von links nach rechts: Jedes Wort wirkt auf den Stack, den das Wort davor hinterlassen hat. Hier siehst du, was swap nip mit dem Stack 1 2 (unten → oben) macht, Wort für Wort:
1 2 ! 1 2 the starting crates
swap ! 2 1 swap flipped the top two
nip ! 1 nip dropped the 2nd-from-top crate (the 2)
Und hier dup rot auf denselben Ausgangskisten, wieder Wort für Wort:
1 2 ! 1 2 the starting crates
dup ! 1 2 2 dup copied the top crate
rot ! 2 2 1 rot rolled the 3rd-from-top crate up to the top
Wörter verwenden lowercase-kebab-case: Kleinbuchstaben, die durch Bindestriche verbunden werden.
Du bist ein Deckshand und verstaust die Frachtkisten am Kai neu. Jede Aufgabe ist ein einzelnes Wort, das in seinem Inneren nur Shuffle-Wörter verwendet, keine Arithmetik.
Definiere das Wort swap-crates. Es nimmt zwei Kisten vom Stapel und lässt
sie in umgekehrter Reihenfolge zurück.
1 2 swap-crates .s
! 2
! 1
Definiere das Wort clear-spill. Es nimmt drei Kisten vom Stapel und lässt
die unteren beiden zurück, während es die oberste verwirft.
1 2 3 clear-spill .s
! 1
! 2
Definiere das Wort peek-under. Es nimmt zwei Kisten vom Stapel und lässt
sie zurück, wobei eine Kopie der unteren Kiste obenauf gelegt wird.
1 2 peek-under .s
! 1
! 2
! 1
Definiere das Wort tidy-deck. Es nimmt drei Kisten vom Stapel, und zwar in
der Reihenfolge x y z, und lässt z z y zurück: Verwirf die unterste
Kiste und lass dann zwei Kopien der obersten Kiste unter der mittleren
liegen.
1 2 3 tidy-deck .s
! 3
! 3
! 2
Melde dich bei Exercism an, um Factor mit 47 Konzepte163 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.