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* израза, а не након њега.

This is because the let* statement defines an area in your script in which the declared variables are usable; if you type the (+ a b) statement after the (let* …) statement, you'll get an error, because the declared variables are only valid within the context of the let* statement; they are what programmers call local variables.

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

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

        (let* ( variables )
          expressions )
      

where variables are declared within parens, e.g., (a 2), and expressions are any valid Scheme expressions. Remember that the variables declared here are only valid within the let* statement — they're local variables.

3.2.4. Празнине

Previously, we mentioned the fact that you'll probably want to use indentation to help clarify and organize your scripts. This is a good policy to adopt, and is not a problem in Scheme — white space is ignored by the Scheme interpreter, and can thus be liberally applied to help clarify and organize the code within a script. However, if you're working in Script-Fu's Console window, you'll have to enter an entire expression on one line; that is, everything between the opening and closing parens of an expression must come on one line in the Script-Fu Console window.

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) је језик без типова. Ово је згодно и омогућава брже писање скрипти.

  • Second, notice that we don't need to worry about how to return the result of our function — the last statement is the value returned when calling this function. Type the function into the console, then try something like:

    (AddXY (AddXY 5 6) 4)