Go to the first, previous, next, last section, table of contents.


Kontrolne strukture

Kontrola

Primjedba: u slijedecim opisima, instructionlist (instrukcijska lista) moze biti lista ili rijec. U ovom -- drugom slucaju, rijec se parse-ira (analizira) u listu prije nego se izvrsi. Tako da ce i RUN READWORD i RUN READLIST raditi. Prvi oblik se preferira jer dozvoljava linije koje su nastavljene (sa ~) i ukljucuju komentare (sa ;) na prvoj liniji.

run

RUN instructionlist

komanda ili operacija. Izvrsi Logo instrukcije u input listi; outputira ako lista sadrzi izraz koji outputira.

See section readword ; section readlist

runresult

RUNRESULT instructionlist

izvrsi instrukcije u inputu; outputira praznu listu, ako te instrukcije ne daju output, ili listu ciji jedini clan je output inputiranih instrukcija. Moze posluziti za pisanje novih komanda-ili-operacija kontrolnih struktura:

local "result
make "result runresult [something]
if emptyp :result [stop]
output first :result

repeat

REPEAT num instructionlist

komanda. Izvrsava uzastopno instructionlist (listu instrukcija), num (broj) puta.

repcount

REPCOUNT

outputira broj repeticije od "naj-unutrasnijeg" trenutacno aktivnog REPEAT, pocevsi sa 1. Ako nema aktivnog REPEAT outputira -1.

if

IF tf instructionlist
(IF tf instructionlist1 instructionlist2)

komanda. Ako prvi input ima vrijednost TRUE, tada IF izvrsi drugi input. Ako prvi input ima vrijednost FALSE, tada IF ne napravi nista. (Ako je dan i treci input, IF se tada ponasa kao IFELSE, sto je opisano dolje.) Greska je ako prvi input nije ili TRUE ili FALSE.

Radi kompatibilnosti sa ranijim verzijama Loga, ako IF nije u zagradama, a prva stvar na instrukcijskoj liniji nakon drugog inputa je lista u uglatim zagradama, IF se tretira kao IFELSE, ali se ispise "warning message" (poruka upozorenja). Ako se ovaj nepravilni oblik IF-a upotrijebi u tijelu procedure, upozorenje se pojavi samo prilikom prvog poziva procedure (unutar jednog rada sa Logom).

ifelse

IFELSE tf instructionlist1 instructionlist2

komanda ili operacija. Ako prvi input ima vrijednost TRUE, onda IFELSE izvrsi drugi input. Ako prvi input ima vrijednost FALSE, onda IFELSE izvrsi treci input. IFELSE outputira vrijednost ako instructionlist1 ili instructionlist2 sadrze izraz koji outputira vrijednost.

test

TEST tf

komanda. Zapamti svoj input, koji mora biti TRUE ili FALSE, za kasniju upotrebu sa IFTRUE ili IFFALSE instrukcijama. Efekt od TEST je lokalan u proceduri u kojoj je pozvan; svi odgovarajuci IFTRUE ili IFFALSE moraju biti u istoj proceduri ili u njenim podprocedurama.

See section iffalse

iftrue

IFTRUE instructionlist
IFT instructionlist

komanda. Izvrsi svoj input, ako je zadnja TEST instrukcija imala TRUE input. TEST je morao biti ili u istoj proceduri, ili u superproceduri.

iffalse

IFFALSE instructionlist
IFF instructionlist

komanda. Izvrsi svoj input, ako je zadnja TEST instrukcija imala FALSE input. TEST je morao biti ili u istoj proceduri, ili u superproceduri.

See section test

stop

STOP

komanda. Zavrsi izvrsenje procedure u kojoj se pojavi. Kontrola se vrati kontekstu iz kojeg je procedura pozvana. Zaustavljena procedura ne outputira vrijednost.

output

OUTPUT value
OP value

komanda. Zaustavi proceduru u kojoj se nalazi. Ta procedura outputira (vrati) vrijednost value u kontekst (proceduri ili okruzenju) koje ju je pozvalo. Nemojte se zbuniti: OUTPUT je komanda, ali procedura koja poziva OUTPUT je operacija.

catch

CATCH tag instructionlist

comanda ili operacija. Izvrsi svoj drugi input. Outputira ako instructionlist outputira. Ako je, za vrijeme izvodjenja instructionlist-e, pozvana instrukcija THROW sa tagom (naljepnicon) jednakom prvom inputu tag (case-insensitive usporedba), tada se izvrsavanje instructionliste odmah prekida. U tom slucaju CATCH outputira, ako je THROW dobio input vrijednost. Tag mora biti rijec.

Ako je tag rijec ERROR, tada bilo koja greska koja se dogodi za vrijeme izvrsenja instructionliste ima za rezultat THROW "ERROR, umjesto da ispise error poruku i vrati program u toplevel. CATCH ne outputira nista ako je greska uhvacena. Takodjer, za vrijeme izvrsenja instructionlist-e, varijabla ERRACT je privremeno nevezana (nema vrijednost). (Ako se desi greska dok ERRACT ima vrijednost, ta vrijednost se uzima kao instructionlista, koja se izvrsava nakon ispisivanja poruke o greski. Tipicno, vrijednost ERRACT, ako je ima, je lista [pause].)

See section error ; section erract ; section pause

throw

THROW tag
(THROW tag value)

komanda. Mora biti upotrijebljena unutar vidljivosti CATCH komande sa istim tag-om. Zavrsi izvrsavanje instrukcijske liste od CATCH. Ako je THROW pozvan sa jednim inputom, odgovarajuci CATCH ne outputira vrijednost. Ako je pozvan sa dva inputa, drugi input je output za CATCH.

THROW "TOPLEVEL se moze upotrijebiti da zaustavi sve pokrenute procedure i interaktivne pauze, i da nas vrati u Logo prompt "?". Stiskajuci sistemski kontrolni znak (normalno ctrl-c za Unix, ctrl-Q za DOS, ili command-period za Mac) ima isti ucinak.

THROW "ERROR se moze upotrijebiti da generira situaciju greske. Ako greska nije uhvacena, ispise poruku (THROW "ERROR) sa uobicajenim indikacijama gdje se greska (u ovom slucaju THROW) dogodila. Ako je drugi input upotrijebljen sa tag-om od ERROR, taj drugi input se upotrijebi kao tekst poruke o greski. Takodjer, u tom slucaju, indicirana lokacija greske nece biti lokacija THROW, nego lokacija gdje je procedura koja sadrzi THROW pozvana. Ovo dozvoljava user definiranim procedurama da generiraju poruke o greskama kao da su primitivi. Pazite: u ovom slucaju, odgovarajuci CATCH "ERROR, ako postoji, ne outputira, jer drugi input THROW-u se ne smatra povratnom vrijednoscu.

THROW "SYSTEM odmah izlazi iz Loga, i vraca se u operativni sistem, bez ispisivanja uobicajene pozdravne poruke i bez brisanja privremenog file-a ispisanog od EDIT.

See section edit

error

ERROR

outputira listu koja opisuje upravo uhvacenu gresku, ako ih ima. Ako nije bila uhvacena greska od zadnjeg poziva ERROR, outputira praznu listu. Error lista sadrzi cetiri elementa: cijeli broj koji odgovara tipu greske, tekst error poruke, ime procedure u kojoj se greska desila i liniju u kojoj se greska desila.

pause

PAUSE

komanda ili operacija. Ulazi u interaktivnu pauzu. User (onaj koji radi sa Logom - programom) se pita za instrukcije sa promptom, kao u toplevel-u, ali prompt sadrzi i ime procedure u kojoj je PAUSE pozvan. Lokalne varijable te procedure su dostupne za vrijeme pauze. PAUSE outputira, ako je zavrsena pozivom na CONTINUE sa inputom.

Ako postoji varijabla ERRACT, i desi se stanje greske, sadrzaj te varijable se izvrsi kao instrukcijska lista. ERRACT-u se tipicno dodijeli vrijednost [PAUSE], tako da se udje u stanje interaktivne pauze nakon greske. Time je omoguceno user-u da provjeri vrijednosti lokalnih varijabli u trenutku nastanka greske.

Pritiskajuci sistemski quit znak (uobicajeno control-\ za Unix, control-W za DOS, ili command-coma za Mac) ce nas takodjer staviti u pauzu.

See section erract

continue

CONTINUE value
CO value
(CONTINUE)
(CO)

komanda. Prekida interaktivnu pauzu, i nastavlja tamo gdje je program stao prije pozivanja PAUSE. Ako je CONTINUE dobio input, ta vrijednost se upotrijebi kao output od PAUSE. Ako ne, PAUSE ne outputira.

Izuzetno, CONTINUE moze biti upotrijebljen bez svoga inputa i bez zagrada, ako nema nista iza njega na liniji.

wait

WAIT time

komanda. Odgodi daljnje izvrsavanje programa za time 60-ina sekunde. Takodjer uzrokuje trenutacni ispis svih buffered (spremljenih u line buffer) znakova na terminal. WAIT 0 se moze upotrijebiti za ispiranje buffera bez cekanja.

bye

BYE

komanda. Izlazi iz Loga; vraca u operativni sistem.

.maybeoutput

.MAYBEOUTPUT value				(specijalna forma)

radi kao OUTPUT osim ako izraz koji daje input vrijednost, zapravo nema nista za output, u kome slucaju se .MAYBEOUTPUT ponasa kao STOP. Namijenjen je za upotrebu u definiranju kontrolnih struktura, kada ne znamo da li ce neki izraz proizvesti vrijednost. Primjer:

to invoke :function [:inputs] 2
.maybeoutput apply :function :inputs
end

? (invoke "print "a "b "c)
a b c
? print (invoke "word "a "b "c)
abc

To je alternativa RUNRESULT-u. Brza je i jednostavna za upotrebu, ali pretstavlja izuzetak u Logo evaluation pravilima (pravilima vrednovanja -- zato je specijalna forma). (Obicno bi bila greska, da izraz koji treba osigurati input necemu, nema vrijednosti; kao gore u prvoj upotrebi invoke.)

See section output ; section stop ; section runresult

goto

GOTO word

komanda. Potrazi TAG komandu sa istim inputom u istoj proceduri, i nastavi izvrsavanje procedure sa te TAG lokacije. Besmisleno je upotrijebiti GOTO izvan procedure.

tag

TAG quoted.word

komanda. Ne radi nista. Iput mora biti doslovna rijec (iza navodnika "), ne rezultat racunanja. Tag-ove upotrebljava GOTO komanda.

ignore

IGNORE value					(library procedura)

komanda. Ne radi nista. Upotrebljava se kada je neki izraz upotrijebljen radi svoga "side" (uzgrednog) efekta, a ne zbog vrijednosti koju vraca i koja je nevazna -- koja zapravo smeta.

`

` list						(library procedura)

outputira listu jednaku svom inputu, ali sa odredjenim supstitucijama. Ako je rijec `,' (zarez) clan input liste, onda bi slijedeci clan morao biti lista instrukcija koje daju output kada ih se izvrsi. Vrijednost tog outputa zamijeni zarez i listu instrukcija. Ako je clan input liste rijec `,@' (zarez at-znak) tada bi slijedeci clan morao biti lista instrukcija koja outputira listu kada se izvrsi. Clanovi te liste zamijene `,@' i listu instrukcija. Primjer:

show `[foo baz ,[bf [a b c]] garply ,@[bf [a b c]]]

ce ispisati

[foo baz [b c] garply b c]

for

FOR forcontrol instructionlist			(library procedura)

komanda. Prvi input mora biti lista koja sadrzi tri ili cetiri clana: (1) rijec, koja ce biti upotrijebljena kao ime lokalne varijable; (2) rijec ili lista koja ce biti evaluirana kao sa RUN da bi se nasao broj, pocetna vrijednost varijable; (3) rijec ili lista koja ce biti evaluirana da se nadje broj, granicna vrijednost varijable; (4) uvjetni input (ne mora postojati) koji ce biti evaluiran da se utvrdi velicina koraka. Ako nema cetvrtog clana, velicina koraka ce biti 1 ili --1, ovosno o tome da li je granicna vrijednost veca ili manja od pocetne vrijednosti lokalne varijable.

Drugi input je instrukcijska lista. Zadatak FOR je da izvrsava instructionlist-u uzastopno, dodijeljujuci novu vrijednost kontrolnoj varijabli (onoj koju je imenovao prvi clan forcontrol liste) svaki puta. Naprije se pocetna vrijednost dodijeli kontrolnoj varijabli. Zatim se ta vrijednost usporedi sa granicnom vrijednoscu. FOR je zavrsio kada je predznak (sadasnja_vrijednost -- granicna_vrijednost) isti kao predznak velicine koraka. Ako explicitna vrijednost koraka nije data, instrukcijska lista se izvrsi barem jednom. Explicitna vrijednost velicine koraka moze dovesti do zero-trip FOR (FOR-a koji ne izvrsi instrukcijsku listu niti jednom), na primjer, FOR [I 1 0 1] .... Inace -- izvrsi se instructionlist, korak se doda vrijednosti kontrolne varijable, i FOR ponovo izvrsi sve radnje (ponovo usporedi sadasnju vrijednost kontrolne varijable i granicnu vrijednost).

? for [i 2 7 1.5] [print :i]
2
3.5
5
6.5
?

See section run

do.while

DO.WHILE instructionlist tfexpression		(library procedura)

komanda. Uzastopno evaluira instructionlist tako dugo dok tfexpression ostaje TRUE. Evaluira prvi input prvo, tako da se instructionlist izvrsi barem jednom. tfexpression mora biti izraz (lista izraza) cija je vrijednost nakon evaluiranja TRUE ili FALSE.

while

WHILE tfexpression instructionlist		(library procedura)

komanda. Uzastopno evaluira instructionlist, tako dugo dok evaluirana tfexpression ostane TRUE. Evaluira prvo, prvi input, tako da se moze desiti da se instructionlist ne izvrsi niti jednom. tfexpression mora biti izraz cija je vrijednost TRUE ili FALSE.

do.until

DO.UNTIL instructionlist tfexpression		(library procedura)

komanda. Uzastopno evaluira instructionlist tako dugo dok tfexpression ostaje FALSE. Evaluira prvi input prvo, tako da se instructionlist izvrsi barem jednom. tfexpression mora biti izraz (lista izraza) cija je vrijednost nakon evaluiranja TRUE ili FALSE.

until

UNTIL tfexpression instructionlist		(library procedura)

komanda. Uzastopno evaluira instructionlist tako dugo dok evaluirana tfexpression ostaje FALSE. Evaluira prvo prvi input, tako da se moze desiti da se instructionlist uopce ne izvrsi. tfexpression mora biti izraz cija je vrijednost TRUE ili FALSE.

Template-bazirana iteracija

Procedure u ovoj sekciji su iteracijski alati (alati za ponavljanje), a zasnivaju se na ideji template-a (sablone). To je generalizacija instrukcijske liste ili izrazovne liste (expression list) u koju su ugradjeni pretinci, da bi alati u njih mogli ubacivati razne podatke. Mogu se upotrijebiti cetiri razlicita oblika template-a.

Najcesce upotrebljavani oblik je explicit-slot oblik, ili upitnik oblik. Primjer:

? show map [? * ?] [2 3 4 5]
[4 9 16 25]
?

U ovom je primjeru, MAP alat evaluirao template [? * ?] uzastopno, sa svakim clanom data liste [2 3 4 5], zamijenjenim za upitnike. Ista vrijednost je upotrijebljena za oba upitnika prilikom jedne evaluacije. Neki alati dozvoljavaju paralelnu upotrebu vise od jedne vrijednosti po evaluaciji; u tim slucajevima pretinci su oznaceni sa ?1 za prvi podatak, ?2 za drugi itd.:

? show (map [(word ?1 ?2 ?1)] [a b c] [d e f])
[ada beb cfc]
?

Ako template zeli izracunati broj podatka, oblik (? 1) je ekvivalentan ?1, tako da (? ?1) znaci podatak ciji broj je dan u podatku broj 1. Neki alati dozvoljavaju dodatne oznake pretinaca, kao sto je pokazano u individualnim opisima.

Drugi oblik template-a je named-procedure oblik. Ako je template rijec, a ne lista, uzima se kao ime procedure. Ta procedura mora primati broj inputa jednak broju paralelnih pretinaca koje alat ima; procedura se aplicira na sve date podatke po redu. To jest, ako su podaci ?1 do ?3 prisutni, template "PROC je jednak [PROC ?1 ?2 ?3].

? show (map "word [a b c] [d e f])
[ad be cf]
?

to dotprod :a :b      ; vector dot product
op apply "sum (map "product :a :b)
end

Treci oblik template-a je named-slot ili lambda oblik. Ovaj oblik je oznacen sa template listom koja sadrzi vise od jednog clana, ciji prvi clan je takodjer lista. Prvi clan je lista imena; lokalne varijable su stvorene sa tim imenima i pridruzene su im po redu dostupne vrijednosti. Broj imena mora biti jednak broju prisutnih vrijednosti. Ovaj oblik se uglavnom upotrebljava kada se jedan iteracijski alat mora upotrijebiti unutar template-a drugog alata, a ? notacija bi bila nejasna u unutrasnjem template-u. Primjer:

to matmul :m1 :m2 [:tm2 transpose :m2]    ; multiply two matrices
output map [[row] map [[col] dotprod :row :col] :tm2] :m1
end

Cetvrti oblik je procedure-text oblik, varijanta lambda oblika. U ovom obliku, template lista sadrzi barem dva clana, a svi su liste. To je oblik koji upotrebljavaju DEFINE i TEXT primitivi, a APPLY prihvaca, te tako tekst definirane procedure moze biti upotrijebljen kao template.

Pazite: Cetvrti oblik template-a se interpretira drugacije od ostalih, po tome sto Logo smatra da je to nezavisno definirana procedura sa svrhom OUTPUT i STOP. Na primjer, slijedece dvije instrukcije su identicne:

? print apply [[x] :x+3] [5]
8
? print apply [[x] [output :x+3]] [5]
8

iako je prva instrukcija u named-slot obliku a druga u procedure-text obliku. Named-slot oblik se moze razumjeti kao naredba Logu da evaluira izraz :x+3 na mjesto cijele invokacije APPLY, sa varijablom x kojoj je privremeno dana vrijednost 5. Procedure-text oblik mozemo razumjeti kao poziv proceduri

to foo :x
output :x+3
end

sa argumentom 5, ali bez davanja stvarnog imena proceduri. Da smo zamijenili OUTPUT u ova dva primjera, dobili bi greske:

? print apply [[x] output :x+3] [5]
Can only use output inside a procedure
? print apply [[x] [:x+3]] [5]
You don't say what to do with 8

Named-slot oblik moze biti upotrijebljen sa STOP ili OUTPUT unutar procedure, da zaustavi tu proceduru.

Iteracijski alati koji slijede su prosirene verzije alata opisanih u Dodatku B, knjige _Computer_Science_Logo_Style,_Volume_3:_Advanced_Topics_ by Brian Harvey [MIT Press, 1987]. Prosirenja primarno dozvoljavaju promjenjivi broj inputa.

apply

APPLY template inputlist

komanda ili operacija. Izvrsi temlate, puneci njegove pregrade sa clanovima inputlist-e. Broj clanova inputlist-e mora biti prihvatljiv broj pregrada za template. Nije dozvoljeno upotrijebiti primitiv TO kao template, ali sve drugo je u redu. APPLY outputira ono sto template outputira, ako ista.

See section to

invoke

INVOKE template input				(library procedura)
(INVOKE template input1 input2 ...)

komanda ili operacija. Upravo kao APPLY osim sto su inputi dati kao samostalni izrazi, a ne unutar liste.

foreach

FOREACH data template				(library procedura)
(FOREACH data1 data2 ... template)

komanda. Evaluira uzastopno template listu, jednom za svakog clana data liste (liste podataka). Ako je dano vise od jedne data liste, sve moraju biti iste duzine. (Data inputi mogu biti rijeci, u kojem slucaju se template evaluira jednom za svaki znak.

U templateu, simbol ?REST predstavlja dio data inputa desno od clana koji se trenutacno upotrebljava kao ispuna ? filter pretinca. To jest, ako je data input [A B C D E] i template se evaluira sa ? zamijenjenim sa B, tada bi ?REST bio zamijenjen sa [C D E]. Ako se upotrebljavaju paralelni pretinci, onda (?REST 1) ide sa ?1, itd.

U templateu, simbol # predstavlja poziciju u data inputu od clana koji trenutacno puni ? filter pretinac. To jest, ako je data input [A B C D E] a template se evaluaira sa ? zamijenjenim sa B, tada bi # bio zamijenjen sa 2.

map

MAP template data				(library procedura)
(MAP template data1 data2 ...)

outputira rijec ili listu, ovisno o tipu data inputa, iste duzine kao taj input. (Ako je dato vise data inputa, output je istog tipa kao data1.) Svaki clan outputa je rezultat evaluiranja template liste, puneci pretince u templateu sa odgovarajucim clanom (clanovima) data inputa. (Svi data inputi moraju biti iste duzine.) U slucaju da je output rijec, rezultati evaluacije templatea moraju biti rijeci, i one se spajaju sa WORD.

U templateu, simbol ?REST pretstavlja dio data inputa desno od clana koji se trenutacno upotrebljava kao ispuna ? pretinca. To jest, ako je data input [A B C D E] i template se evaluira sa ? zamijenjenim sa B, tada bi ?REST bio zamijenjen sa [C D E]. Ako se upotrebljavaju paralelni pretinci, onda (?REST 1) ide sa ?1, itd.

U templateu, simbol # predstavlja poziciju u data inputu od clana koji trenutacno puni ? pretinac. To jest, ako je data input [A B C D E] a template se evaluaira sa ? zamijenjenim sa B, tada bi # bio zamijenjen sa 2.

See section word

map.se

MAP.SE template data				(library procedura)
(MAP.SE template data1 data2 ...)

outputira listu formiranu evaluacijom template liste uzastopno i spajajuci rezultate upotrebljavajuci SENTENCE. Tj., clanovi outputa su clanovi rezultata evaluacija. Output lista moze, prema tome, biti razlicite duzine od data inputa. (Ako je rezultat evaluacije prazna lista, ne doprinosi finalnom outputu.) Data inputi mogu biti rijeci ili liste.

U templateu, simbol ?REST pretstavlja dio data inputa desno od clana koji se trenutacno upotrebljava kao ispuna ? pretinca. To jest, ako je data input [A B C D E] i template se evaluira sa ? zamijenjenim sa B, tada bi ?REST bio zamijenjen sa [C D E]. Ako se upotrebljavaju paralelni pretinci, onda (?REST 1) ide sa ?1, itd.

U templateu, simbol # predstavlja poziciju u data inputu od clana koji trenutacno puni ? pretinac. To jest, ako je data input [A B C D E] a template se evaluaira sa ? zamijenjenim sa B, tada bi # bio zamijenjen sa 2.

See section sentence

filter

FILTER tftemplate data				(library procedura)

ouputira rijec ili listu, ovisno o tipu data inputa, koja sadrzi podskup clanova (za listu) ili znakova (za rijec) od inputa. Template se evaluira jednom za svaki clan ili znak input podatka i mora dati TRUE ili FALSE rezultat. Ako je rezultat TRUE, onda se odgovarajuci dio inputa (data) ukljucuje u output.

? print filter "vowelp "elephant
eea
?

U templateu, simbol ?REST pretstavlja dio data inputa desno od clana koji se trenutacno upotrebljava kao ispuna ? filter pretinca. To jest, ako je data input [A B C D E] i template se evaluira sa ? zamijenjenim sa B, tada bi ?REST bio zamijenjen sa [C D E].

U templateu, simbol # predstavlja poziciju u data inputu od clana koji trenutacno puni ? filter pretinac. To jest, ako je data input [A B C D E] a template se evaluaira sa ? zamijenjenim sa B, tada bi # bio zamijenjen sa 2.

find

FIND tftemplate data				(library procedura)

outputira prvi elemenat data inputa (prvi clan liste, ili prvi znak iz rijeci) za koji je rezultat evaluiranja templatea sa tim elementom u ? pretincu TRUE. Ako nema takovog elementa, outputira praznu listu.

U templateu, simbol ?REST pretstavlja dio data inputa desno od clana koji se trenutacno upotrebljava kao ispuna ? filter pretinca. To jest, ako je data input [A B C D E] i template se evaluira sa ? zamijenjenim sa B, tada bi ?REST bio zamijenjen sa [C D E].

U templateu, simbol # predstavlja poziciju u data inputu od clana koji trenutacno puni ? filter pretinac. To jest, ako je data input [A B C D E] a template se evaluaira sa ? zamijenjenim sa B, tada bi # bio zamijenjen sa 2.

reduce

REDUCE template data				(library procedura)

outputira rezultat apliciranja template-a da akumulira sve clanove data inputa. Template mora biti funkcija sa dva pretinca. To je tipicno neka asocijativna funkcija kao SUM. Ako data input ima samo jedan sastavni dio (clana liste ili znak u rijeci), output je taj dio. Inace, template se prvo aplicira sa ?1 popunjenim sa predzadnjim clanom, a ?2 sa zadnjm clanom. Zatim ako ima jos clanova, template se aplicira sa ?1 popunjenim sa slijedecim clanom na lijevo, a ?2 sa rezultatom prijasnje evaluacije. Taj se proces nastavi dok svi clanovi nisu upotrijebljeni. Data input nesmije biti prazan.

Primjedba: Ako je template, kao SUM, ime procedure koja je sposobna uzeti vise inputa, efikasnije je upotrijebiti APPLY umjesto REDUCE. REDUCE je dobar za asocijativne procedure koje su pisane da prime tocno dva inputa:

to max :a :b
output ifelse :a > :b [:a] [:b]
end

print reduce "max [...]	

Alternativno, REDUCE moze biti upotrijebljen da se napise MAX kao procedura koja prihvaca bilo koji broj inputa, kao i SUM:

to max [:inputs] 2
if emptyp :inputs ~
    [(throw "error [not enough inputs to max])]
output reduce [ifelse ?1 > ?2 [?1] [?2]] :inputs
end

See section sum ; section apply

crossmap

CROSSMAP template listlist			(library procedura)
(CROSSMAP template data1 data2 ...)

outputira listu koja sadrzi rezultat evaluiranja templatea. Iz svake liste podataka (data list) popunjava se jedan pretinac u templateu; broj pretinaca je jednak broju data list inputa. Ako je samo jedan input, onda je on lista lista, od kojih svaka puni jedan slot u templateu. CROSSMAP se razlikuje od MAP po tome sto umjesto da kao MAP uzima clanove inputa paralelno, uzima sve moguce kombinacije clanova inputa, koji ne moraju biti iste duzine.

? show (crossmap [word ?1 ?2] [a b c] [1 2 3 4])
[a1 a2 a3 a4 b1 b2 b3 b4 c1 c2 c3 c4]
?

Zbog kompatibilnosti sa prvim izdanjem CSLS(1), CROSSMAP template moze imati notaciju :1 umjesto ?1 da oznaci pretince.

See section map

cascade

CASCADE endtest template startvalue		(library procedura)
(CASCADE endtest tmp1 sv1 tmp2 sv2 ...)
(CASCADE endtest tmp1 sv1 tmp2 sv2 ... finaltemplate)

outputira rezultat apliciranja templatea (ili nekoliko templatea, kako je objasnjeno ispod) uzastopno, ispunjavajuci pretinac danom vrijednoscu startvalue prvi puta, a rezultatom svakog apliciranja iduci puta.

U najjednostavnijem slucaju, CASCADE ima tri inputa. Drugi input je template (sablona) sa jednim pretincem (izrazom). Taj template se evaluira (vrednuje) nekoliko puta (mozda nijednom). U prvoj evaluaciji pretinac je popunjen sa trecim inputom; u slijedecim evaluacijama, pretinac je popunjen sa rezultatom prethodne evaluacije. Broj evaluacija je odredjen prvim inputom. To moze biti ili nenegativni integer, u kojem se slucaju setemplate evaluira toliko puta, ili template sa predikatskim izrazom, u kojem se slucaju evaluira (sa istom popunom pretinca kao i drugi input) uzastopno, i CASCADE evaluacija se nastavlja dok god je vrijednost predikata FALSE. (Drugim rijecima, predikatski template odredjuje uvjet za zaustavljanje.)

Ako je template evaluiran nula puta, output od CASCADE je treci input startvalue. Inace, output je vrijednost koju da zadnja evaluacija templatea.

CASCADE templates mogu sadrzati simbol # koji predstavlja broj, koliko je puta template evaluiran. Taj pretinac se puni sa 1 prvi puta, sa 2 drugi puta, itd.

? show cascade 5 [lput # ?] []
[1 2 3 4 5]
? show cascade [vowelp first ?] [bf ?] "spring
ing
? show cascade 5 [# * ?] 1
120
?

Nekoliko nanizanih CASCADE rezultata mogu biti izracunati paralelno, dajuci dodatne template-startvalue parove kao inpute za CASCADE. U tom slucaju, svi templatei (ukljucujuci i endtest (koji daje test za kraj) su sa vise pretinaca, sa brojem pretinaca jednakim broju parova inputa. U svakom krugu evaluacije, ?2 pretstavlja rezultat evaluiranja drugog templatea u prethodnom krugu. Ako je ukupan broj inputa (ukljucujuci endtest input) neparan, tada je output od CASCADE finalna vrijednost prvog templatea. Ako je ukupan broj inputa paran, tada je zadji input template koji ce se evaluairati jednom, nakon sto je endtest zadovoljen, da bi odredio output od CASCADE.

to fibonacci :n
output (cascade :n [?1 + ?2] 1 [?1] 0)
end

to piglatin :word
output (cascade [vowelp first ?] ~
    [word bf ? first ?] ~
    :word ~
    [word ? "ay])
end

cascade.2

CASCADE.2 endtest temp1 startval1 temp2 startval2  (library procedura)

outputira rezultat poziva CASCADE sa istim inputima. Jedina razlika je u tome sto je standardni broj inputa 5 a ne 3.

transfer

TRANSFER endtest template inbasket		(library procedura)

outputira rezultat uzastopnog evaluiranja template-a. Template se evaluira jednom za svakog clana liste inbasket. TRANSFER odrzava outbasket koji je inicijalno prazna lista. Nakon svakog evaluiranja template-a, rezultat postaje novi outbasket.

U template-u, simbol ?IN pretstavlja sadasnjeg clana iz inbasket; simbol ?OUT pretstavlja cijeli sadasnji outbasket. Ostali slot (pretinac) simboli se ne bi trebali upotrebljavati.

Ako je prvi endtest input prazna lista, evaluacija se nastavlja dok svi clanovi inbasket-a nisu upotrijebljeni. Ako nije, prvi input mora biti predikatski izraz i evaluacija se nastavlja dok, ili vrijednost endest-a ne postane TRUE, ili dok se ne isprazni inbasket.


Go to the first, previous, next, last section, table of contents.