Nå som vi veit at alle utsegner i Scheme er omslutta av parentesar og at alle funksjons- og operatornamna kjem først i lista, er vi klare for å sjå på korleis vi kan lage og bruke variablar og funksjonar. Vi byrjar med variablane.
Den vanlegaste måten å deklarera variablar på, er ved hjelp av konstruktøren let*. (I andre språk vil dette vere ekvivalenten til å definera ei liste eller ein tabell med lokale variablar og områda dei kan nyttast i). Som eit eksempel kan vi definera to variablar, a og b, og tilordna dei verdiane 1 og 2. Å “tilordna” vil seia å bestemme kva verdi variabelen skal ha. a blir tilordna 1, dvs. blir gitt verdiinnhaldet 1. (“a = 1”). Dette kan vi skrive slik:
(let* ( (a 1) (b 2) ) (+ a b) )
eller på ei linje:
(let* ( (a 1) (b 2) ) (+ a b) )
Notat | |
---|---|
Når du bruker konsollvindauget, er du nøydd til å skriva alt på ei linje. Elles kan du nytta den metoden du meiner gir best oversyn over programmet. Meir om dette i under “kvite mellomrom”. |
Dette deklarerar to lokale variablar, a og b, legg verdiar i variablane, her a = 1 og b = 2, og skriv ut summen av dei: 3.
Du la kanskje merke til at vi skreiv addisjonen (+ a b)
innføre parentesane til let*
-uttrykket, og ikkje etter.
Dette er fordi let*
-uttrykket definerer området i
skriptet der desse variablane er
gyldige, altså der dei kan brukast. Prøver du å skriva uttrykket (+ a
b) etter uttrykket (let* ...), vil du få ei feilmelding. Dei
deklarerte variablane er bare gyldige innføre det uttrykket dei er
definerte inni. Dei er det programmerarane kallar lokale variablar.
(Syntaks = skrivemåte) Den vanlege forma for eit
let*
-utsegn er:
(let* (variables
)expressions
)
der variablane er deklarerte innføre parentesar, t.d. (a 2), og
uttrykka er eit gyldig uttrykk i Scheme. Hugs at variablane som blir
definerte her er lokale variablar, og såleis ikkje gyldige utføre
let*
-uttrykket.
Tidlegare har vi nemnd at det er mogleg å bruke mellomrom og innrykk for å gjere programmet tydelegare, dvs. lettare å lesa. Dette er ein god vane å ta med seg, og er ikkje noe problem i Scheme. Du kan altså setje inn “kvite mellomrom” så mykje du ønskjer. (Opphavet til namnet “kvite mellomrom” kjenner eg ikkje, men det er heilt alminnelege mellomrom som ikkje trengst i programmet, men blir sett inn for å gjere det enklare for oss å lesa kva som står på skjermen).
Arbeider du direkte i konsollvindauget for Script-Fu's må du skrive alt på ei linje. Då er det ikkje mykje behov for mellomromma, utanom dei som Schrimp krev skal vere der.
Det er ofte behov for å endre innhaldet i ein variabel. Dette kan
gjerast med kommandoen set!
. Eit eksempel:
(let* ( (theNum 10) ) (set! theNum (+ theNum theNum)) )
Prøv å finna ut kva uttrykket gjer, og skriv det etterpå inn i konsollvindauget.
Notat | |
---|---|
Bakoverstreken “\” er ein vanleg måte å indikera at det ikkje skal vere linjeskift her. Ikkje skriv bakoverstreken inn i Script-Fu og ikkje trykk Ctrl. Bare fortsett med neste linje dersom skriptet er delt på to linjer, eller på same linja dersom alt er på ei linje. ( “\” er sett inn her i tilfelle du har så smal skjerm at uttrykket må delast på to linjer). |
Når du nå har fått taket på dette med variablar, er det på tide å gå vidare med funksjonar. Alle funksjonar blir definerte etter dette mønsteret:
(define (name
param-list
)expressions
)
der namn
er namnet på funksjonen,
parameterliste
er ei liste med parameternamn skilde med mellomrom, og
uttrykk
er ein serie med uttrykk som funksjonen utførar når han blir kalla
opp. “define”
er eit ord som fortel Scheme at nå skal det definerast ein funksjon.
Eksempel:
(define (AddXY inX inY) (+ inX inY) )
AddXY
er funksjonsnamnet og
inX
og inY
er variablane. Denne funksjonen adderer verdiane som blir lagt i dei
to parametra.
Dersom du er van med andre programmeringsspråk som C/C++, Java, Pascal og liknande, kan det vere du saknar eit par ting i denne definisjonen:
Parametra er ikkje definerte med “type”. Det betyr at dei ikkje er definerte som type “string”, “integer” osv. Scheme er eit “typelaust” språk. Dette gjer det litt raskare å skrive skripta.
Du treng ikkje bekymra deg om korleis funksjonen skal returnera resultatet. Funksjonen sender tilbake verdien av det siste uttrykket. Skriv funksjonen ovanfor inn på konsollen og prøv ut dette, eller noe liknande:
(AddXY (AddXY 5 6) 4)