Amikor n értékből álló sorra van szükséged, ahol mindegyik a saját pozíciójától függ, a Factor <iota> és map együtt oldja meg a feladatot, anélkül hogy ciklusszámlálót kellene írnod.
<iota> és a map
A <iota> (a sequences szótárban) egy nemnegatív egész számot, n-t vesz át, és a 0, 1, …, n-1 egészek virtuális sorozatát adja vissza. A map ezután végigjárja, és minden elemre alkalmazza a quotationt:
USING: math sequences ;
5 <iota> [ 2 * ] map . ! => { 0 2 4 6 8 }
A quotation egyetlen egész számot kap, a pozíciót (az indexet), és a pozícióhoz tartozó értéket hagyja a stacken.
Amikor csak az egyes pozíciók bejárásának mellékhatásaira van szükséged, nem pedig egy új sorozatra, az each-integer (a math szótárban) végigfuttat egy quotationt a 0, 1, …, n-1 értékeken:
each-integer ( n quot: ( i -- ) -- )
A replicate (a sequences szótárban) n-szer hív meg egy quotationt, és összegyűjti az eredményeket, figyelmen kívül hagyva az indexet. Kényelmes n független érték előállításához:
replicate ( n quot: ( -- elt ) -- seq )
USING: sequences ;
3 [ { 0 0 } ] replicate . ! => { { 0 0 } { 0 0 } { 0 0 } }
Amikor az indextartomány nem 0-tól kezdődik, vagy mindkét végén inkluzív szeretnéd, a ranges szótár zárójeles jelöléssel írt literálokat kínál. A szögletes zárójel tartalmazza a végpontot, a kerek zárójel nem.
[a..b] ! a, a+1, …, b (inclusive)
[a..b) ! a, a+1, …, b-1 (half-open at the top)
USING: math ranges sequences ;
3 7 [a..b] [ 2 * ] map . ! => { 6 8 10 12 14 }
3 7 [a..b) [ 2 * ] map . ! => { 6 8 10 12 }
Néhány gyakori, egyargumentumos rövidítés:
[1..b] ! 1, 2, …, b (same as 1 b [a..b])
[1..b) ! 1, 2, …, b-1 (same as 1 b [a..b))
[0..b) ! 0, 1, …, b-1 (same as 0 b [a..b), and same as `b <iota>`)
6 [1..b] [ sq ] map . ! => { 1 4 9 16 25 36 }
6 [1..b) [ sq ] map . ! => { 1 4 9 16 25 }
4 [0..b) [ 1 + ] map . ! => { 1 2 3 4 }
A <iota> a leggyakoribb forma; a [a..b] és társai akkor a megfelelő eszközök, amikor a tartomány nem 0-tól indul, vagy inkluzív felső korlátra van szükség.
A szögletes zárójel tartalmazza a végpontot, a kerek zárójel kizárja azt. Ugyanez a trükk a bal oldalon a (a..b] és (a..b) jelölést adja:
(a..b] ! a+1, …, b (lower open, upper inclusive)
(a..b) ! a+1, …, b-1 (both open)
A 0 n (a..b] { 1 … n }-t ad n > 0 esetén, és { }-t n = 0 esetén. Ez a természetes alak, amikor minden pozitív egészen n-ig bezárólag iterálsz.
Mind a négy zárójeles forma, a [a..b], [a..b), (a..b] és (a..b), lefelé számol, amikor a > b, nem pedig üres eredmény felé halad:
USING: ranges sequences ;
5 1 [a..b] >array . ! => { 5 4 3 2 1 }
1 0 [a..b] >array . ! => { 1 0 } (not empty!)
A map mindig olyan alakot ad, amit a quotation visszaad. Ha a quotation egy karakterkódot hagy a stacken, a >string (a strings szótárban) szöveggé alakítja az eredményt:
USING: math sequences strings ;
4 <iota> [ 2 * CHAR: A + ] map >string . ! => "ACEG"
A CHAR: A a 65 egész számmá alakul. A quotation itt megduplázza az indexet, majd hozzáadja ezt a bázist, amivel minden második nagybetűre jut. Bármilyen aritmetika, amit az indexre építesz, eldönti, melyik karakter kerül abba a pozícióba.
Amikor a karakter az indexre vonatkozó feltételtől függ, a választást a quotation belsejében végezd el:
USING: kernel math sequences strings ;
5 <iota> [ 3 < [ CHAR: a ] [ CHAR: b ] if ] map >string .
! => "aaabb"
Az első három pozíció az i 3 < kifejezést t-ként értékeli ki, így a-t kapnak; a többi b-t. Ugyanez az alak, a [ <test> [ <yes> ] [ <no> ] if ], lefedi a paritásvizsgálatokat az even? / odd? (a math szótárban) szavakkal, valamint a „minden k-adik pozíció” vizsgálatokat a mod és a zero? szavakkal.
Egy bulirobot zászlófüzért fűz fel a nagy mulatságra. A zászlófüzér
minden sora n kis zászlóból álló vízszintes sor, és minden zászló
karakterét az dönti el, hogy hol ül a zászló a sorban, balról 0-tól
kezdve számolva. Segíts a robotnak összeállítani az alábbi mintákat.
Definiáld az alphabet-bunting szót úgy, hogy levegyen a veremből egy
nemnegatív egész n számot, és visszaadja az ábécé első n
kisbetűjéből álló stringet.
5 alphabet-bunting .
! => "abcde"
0 alphabet-bunting .
! => ""
Felteheted, hogy n legfeljebb 26.
Definiáld a counting-bunting szót úgy, hogy vegyen egy n értéket, és
visszaadjon egy n számjegyből álló stringet, amelyben az i
pozícióban lévő zászló i mod 10-et mutat.
12 counting-bunting .
! => "012345678901"
Definiáld a stripe-bunting szót úgy, hogy két karakter között
váltakozzon: a páros pozíciók *-ot, a páratlanok --t kapnak.
6 stripe-bunting .
! => "*-*-*-"
1 stripe-bunting .
! => "*"
Minden ötödik zászló egy különleges jelölő. Definiáld a
marker-bunting szót úgy, hogy a 0, 5, 10, … pozíciók |-t
kapjanak, a többi pedig .-ot.
11 marker-bunting .
! => "|....|....|"
A robot egy rögzített méretű, 10 zászlóból álló füzért akaszt fel,
amely a közepénél egy kampóra kerül. A -5 pozícióban lévő bal szélső
zászlótól 5-ig (de azt már nem beleértve) minden zászló karaktere a
középponttól mért távolság, számjegyként leírva.
Definiáld a valley-bunting szót (bemenet nélkül), hogy adja vissza ezt
a rögzített stringet.
valley-bunting .
! => "5432101234"
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.