A Cargo Shuffle feladatban megismerkedtél a Factor adatvermével és a keverő szavakkal, amelyek átrendezik. Ez a feladat erre épül: olyan szavakat fogsz definiálni, amelyek számolnak a bemeneteikkel, ahelyett hogy csupán ide-oda mozgatnák őket.
A ! egy soros megjegyzést kezd: a Factor mindent figyelmen kívül hagy a !-tól a sor végéig. Az alábbi példákban a !-ot arra használjuk, hogy megjegyezzük vele, mit csinál a kód, és hogy megmutassuk, mit írna ki.
A szó a Factor elnevezése a függvényekre. Amikor meghívsz egy szót, az leemel néhány értéket a verem tetejéről, és néhányat vissza is tesz. A . leemeli a legfelső értéket, és kiírja; az egész számokon működő +, -, * aritmetikai szavak két számot emelnek le, és az eredményt teszik vissza:
2 3 + . ! prints 5
8 3 - . ! prints 5 (8 - 3, not 3 - 8)
2 3 * . ! prints 6
Egy rokon szó, a .s, a teljes adatvermet kiírja anélkül, hogy bármit is elhasználna. Ez a listenerben (a Factor interaktív parancssorában, ahol kódot írhatsz be, és láthatod az eredményeket) hasznos, hogy lásd, mit hagy maga után egy kódrészlet. Ezért végződnek a későbbi példák néha .s-sel a . helyett: egynél több értéket hagynak a vermen, és a .s mindet megmutatja.
Az aritmetikai szavak a math szókészletben élnek, ezért ha egy fájl használni akarja őket, fel kell vennie a math-ot a USING: sorába.
Minden szót dokumentálnak egy veremhatással, amelynek formája ( inputs -- outputs ). Ez a szó szerződése: a szó leemeli a bemeneteket a verem tetejéről, és a helyükre teszi a kimeneteket. A benne szereplő nevek csak azt segítik, hogy könnyebben elolvasd. A Factor nem használja őket, csak azt követi nyomon, milyen sorrendben helyezkednek el az értékek a vermen.
! + is specified as ( x y -- sum )
! . is specified as ( x -- )
A verem teteje a jobb oldali bemenet. Ezért a 8 3 - esetében a 3 van felül, a veremhatás ( x y -- difference ), az eredmény pedig 8 - 3.
A kimenetek végén álló ? az „egy Boolean” szokásos jelölése, de a lasagna feladat csak számokat használ.
Az alábbiakban előkerül egy keverő szó a Cargo Shuffle-ból: a swap ( x y -- y x ), amely megcseréli a két legfelső értéket, ha azok rossz sorrendben állnak a következő szóhoz.
A : kezdi a szó definícióját, utána a veremhatás következik, majd a törzs, végül a ; zárja le.
: square ( x -- x^2 ) dup * ;
4 square . ! => 16
A Factor fordítója ellenőrzi, hogy a törzs valóban illeszkedik-e a megadott veremhatáshoz: az a szó, amely ( x -- y )-t ígér, de nulla vagy két értéket hagy a vermen, nem fog lefordulni.
A CONSTANT: nevet ad egy rögzített értéknek. A konstans maga is egy szó: a meghívása ráteszi az értéket a veremre:
CONSTANT: pi 3
pi pi * . ! => 9
A CONSTANT: alapszintaxis, és nem igényel USING: sort. A konstansokat a fájl elejére tedd, minden olyan szó elé, amely használja őket.
Egy szó törzse meghívhat bármely szót, amely már a scope része, beleértve azokat is, amelyeket korábban ugyanabban a fájlban definiáltál:
: double ( x -- 2x ) 2 * ;
: quadruple ( x -- 4x ) double double ;
5 quadruple . ! => 20
Így használja fel a feladat utolsó részfeladata egy korábbi részfeladatot.
A szavak és a konstansok is a lowercase-kebab-case formát használják: kisbetűk, amelyeket kötőjel kapcsol össze (például expected-bake-time, preparation-time).
Ebben a feladatban kódot írsz majd, amely segít elkészíteni egy remek lasagnét a kedvenc szakácskönyvedből.
Négy részfeladatod van, és mindegyik ahhoz az időhöz kapcsolódik, amit a lasagne elkészítésével töltesz.
Definiáld az expected-bake-time konstanst, amely visszaadja, hány percig kell a lasagnét a sütőben sütni.
A szakácskönyv szerint a lasagnének összesen 40 percet kell a sütőben töltenie.
expected-bake-time .
! => 40
Definiáld a preparation-time szót. Ez leveszi a veremről a lasagnéba rakott rétegek számát, és otthagyja, hány percet töltöttél az előkészítésével, feltéve, hogy minden réteg elkészítése 2 percet vesz igénybe.
4 preparation-time .
! => 8
Definiáld a remaining-time szót. Ez leveszi a veremről a lasagne sütőben már eltöltött perceinek a számát, és otthagyja, hány percet kell még ott maradnia.
25 remaining-time .
! => 15
Definiáld a total-working-time szót. Ez két argumentumot vesz le a veremről, először a lasagnéban lévő rétegek számát, majd azt, hogy hány percet töltött már a lasagne a sütőben, és otthagyja, mennyi volt a teljes, eddig munkával töltött idő: az előkészítési idő plusz a sütőben már eltöltött idő.
3 20 total-working-time .
! => 26
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Factor nyelvet 47 fogalom163 feladat segítségével, valódi emberi mentorálással, mindez ingyen.