3.2. Променљиве и функције

Сада када знамо да је сваки Scheme израз затворен у заграде, и да је назив функције/оператор наведен први, морамо знати како да направимо и користимо променљиве, и како да направимо и користимо функције. Почећемо са променљивама.

3.2.1. Декларисање променљивих

Иако постоји неколико различитих метода за декларисање променљивих, пожељан метод је коришћење let* конструкције. Ако сте упознати са другим програмским језицима, ова конструкција је еквивалентна дефинисању листе локалних променљивих и опсега у којем су оне активне. Као пример, да бисте декларисали две променљиве, a и b, иницијализоване на 1 и 2, респективно, написали бисте:

        (let*
           (
              (a 1)
              (b 2)
           )
           (+ a b)
        )
      

или, као један ред:

(let* ( (a 1) (b 2) ) (+ a b) )
[Примедба] Примедба

Мораћете све ово да ставите у један ред ако користите конзолни прозор. Уопштено говорећи, међутим, желећете да усвојите сличну праксу увлачења како бисте своје скрипте учинили читљивијим. Причаћемо мало више о овоме у одељку о празнинама.

Ово декларише две локалне променљиве, a и b, иницијализује их, а затим исписује збир те две променљиве.

3.2.2. Шта је локална променљива?

Приметићете да смо написали сабирање (+ a b) унутар заграда let* израза, а не након њега.

То је зато што let* наредба дефинише област у вашој скрипти у којој су декларисане променљиве употребљиве; ако укуцате (+ a b) наредбу након (let* …) наредбе, добићете грешку, јер су декларисане променљиве важеће само унутар контекста let* наредбе; оне су оно што програмери зову локалне променљиве.

3.2.3. Општа синтакса let*

Општи облик let* наредбе је:

        (let* ( variables )
          expressions )
      

где се променљиве декларишу унутар заграда, нпр. (a 2), а изрази су било који важећи Scheme изрази. Запамтите да су променљиве декларисане овде важеће само унутар let* наредбе — оне су локалне променљиве.

3.2.4. Празнине

Претходно смо поменули чињеницу да ћете вероватно желети да користите увлачење како бисте разјаснили и организовали своје скрипте. Ово је добра политика за усвајање и није проблем у Scheme-у — интерпретатор Scheme-а игнорише празнине, те се оне могу слободно примењивати како би се разјаснио и организовао код унутар скрипте. Међутим, ако радите у прозору Script-Fu конзоле, мораћете да унесете цео израз у један ред; то јест, све између почетне и завршне заграде израза мора бити у једном реду у прозору Script-Fu конзоле.

3.2.5. Додељивање нове вредности променљивој

Након што сте иницијализовали променљиву, можда ћете морати да промените њену вредност касније у скрипти. Користите set! наредбу да промените вредност променљиве:

        (let* ( (theNum 10) ) (set! theNum (+ theNum theNum)) )
      

Пробајте да претпоставите шта ће горња наредба урадити, а затим је унесите у прозор Скрипт-фу конзоле.

3.2.6. Функције

Сада када сте савладали променљиве, пређимо на рад са функцијама. Функцију дефинишете следећом синтаксом:

        (define
           (
              име
              списак-параметара
           )
           изрази
        )
      

где је име назив додељен овој функцији, списак-параметара је размацима раздвојен списак назива параметара, а изрази је низ израза које функција извршава када се позове. На пример:

(define (AddXY inX inY) (+ inX inY) )

AddXY је име функције, а inX и inY су променљиве. Ова функција узима своја два параметра и сабира их.

Ако сте програмирали у другим императивним језицима (као што су Ц/Ц++, Јава, Паскал итд.), можда ћете приметити да неколико ствари недостаје у овој дефиницији функције у поређењу са другим програмским језицима.

  • Прво, приметићете да параметри немају никакве „типове“ (односно, нисмо их декларисали као ниске, целе бројеве итд.). Ским (Scheme) је језик без типова. Ово је згодно и омогућава брже писање скрипти.

  • Друго, приметићете да не морамо да бринемо о томе како да „вратимо“ резултат наше функције — последњи израз је вредност која се „враћа“ приликом позивања ове функције. Унесите функцију у конзолу, а затим пробајте нешто попут:

    (AddXY (AddXY 5 6) 4)