Tracks
/
Factor
Factor
/
Übungen
/
Frachtumschlag
Frachtumschlag

Frachtumschlag

Lernübung

Einführung

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.

Kommentare

Ein ! beginnt einen Zeilenkommentar. Factor ignoriert alles von ! bis zum Ende der Zeile. Die Beispiele unten nutzen !, um zu kommentieren, was der Code tut.

Der Datenstack

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.

Stackeffekte

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.

Ein Wort definieren

: 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 ;

Wörter zum Umschichten

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.

Wie Wörter zusammenspielen

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

Namenskonventionen

Wörter verwenden lowercase-kebab-case: Kleinbuchstaben, die durch Bindestriche verbunden werden.

Tour: Stacks umschichten

Anleitung

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.

1. Tausche die beiden obersten Kisten

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

2. Räume die verschüttete Kiste weg

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

3. Behalte eine Kopie der darunterliegenden Kiste

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

4. Bring das Deck in Ordnung

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
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Factor Exercism

Bereit, mit Frachtumschlag zu starten?

Melde dich bei Exercism an, um Factor mit 47 Konzepte163 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.