tratto dal Tutorial

Introduzione agli Script

Scheme è il linguaggio di scripting per Gimp.

Prime regole sintattiche:

Ad esempio per richiedere la somma del numero 1 con il numero 23 si scrive

(+ 1 23)

Per preparare un semplice script in GIMP, scegliere

Filtri → Script-Fu → Console
Si apre la finestra che consente di scrivere istruzioni in Scheme:

Nella parte inferiore della finestra c'è un'area di testo denominata Comando corrente. In quest'area si possono provare interattivamente semplici comandi Scheme. Per iniziare si sommino alcuni numeri:

(+ 3 5)

Dopo aver premuto Invio si otterrà la risposta esatta al centro della finestra. Anche l'istruzione seguente funziona correttamente:

(+ 3 5 6)

Infatti al centro della finestra si ottiene la risposta corretta: 14. L'interprete del linguaggio Scheme esegue immediatamente l'istruzione.

Nelle espressioni matematiche le parentesi ricorrono frequentemente, quindi si ricordi che ogni volta che si apre una parentesi tonda bisogna specificare per primo l'operatore e poi gli operandi.

In Scheme è obbligatorio far seguire da uno spazio un operatore matematico o un nome di funzione.


Dichiarazioni di variabili

Per dichiarare le variabili si usa il costrutto let*. Ad esempio per dichiarare due variabili, a e b, inizializzarle rispettivamente a 1 e 2 e poi sommarle si scrive:

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

Se si lavora nella finestra della console di Script-fu si deve immettere una intera espressione su un unica linea, quindi la stessa dichiarazione di variabili, seguita dalla somma, deve essere scritta:

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

Si noti che l'addizione (+ a b) è stata scritta all'interno delle parentesi dell'espressione let* e non dopo di essa.

Infatti l'istruzione let* definisce un'area nello script in cui le variabili dichiarate sono utilizzabili; se si digita l'istruzione (+ a b) dopo l'istruzione (let* ...) si ottiene un errore poichè le variabili dichiarate sono valide unicamente nel contesto dell'istruzione let*, sono cioè variabili locali.

La sintassi dell'istruzione let* è:

        (let* ( variabili )
          espressioni )

Le variabili sono dichiarate all'interno delle parentesi, per esempio (a 2).

In una dichiarazione si assegna il valore iniziale alla variabile, infatti, dopo che viene creata le si può solo assegnare il valore iniziale. Nel corso del programma alla variabile può essere assegnato un nuovo valore con l'istruzione set!:

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

Funzioni

Le funzioni si dichiarano con la seguente sintassi:

        (define 
           (
              nome
              elenco parametri 
           )
           espressioni 
        )

dove nome è il nome assegnato alla funzione, elenco parametri è una lista di parametri separati da spazi e espressioni è una serie di espressioni che la funzione esegue quando viene chiamata. Ad esempio:

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

AddXY è il nome della funzione e inX e inY sono le variabili. Questa funzione prende i suoi due parametri e li somma.

Si osservi che in un linguaggio di script come Scheme non occorre dichiarare il tipo dei parametri. Inoltre il risultato ritornato dalla funzione viene fornito dall'ultima istruzione. Si immetta la funzione nella console e poi si provi qualcosa del tipo:

      (AddXY (AddXY 5 6) 4)

Liste

Una variabile contiene un valore semplice: un intero, un carattere, ecc. Ad esempio l'istruzione:

(let* ( (x 8) ) x)

letta come funzione, dichiara una variabile x, le assegna il valore iniziale 8 e infine restituisce il valore contenuto in x, ciò significa che l'interprete sostituisce il risultato al posto della funzione (in altri termini lo stampa).

Una variabile può anche riferirsi ad un elenco di valori (è il caso degli array). Per assegnare alla variabile x la lista di valori 1, 3, 5 si digiti:

(let* ( (x '(1 3 5))) x)

Si provi a digitare entrambe le istruzioni nella console Script-fu e si osservino le risposte. Quando si esegue la prima istruzione si ottiene il risultato: 8. Quando si esegue la seconda istruzione si ottiene il risultato: (1 3 5).

Si noti che non ci sono virgole nè nella dichiarazione e inizializzazione della lista, nè nel risultato stampato.

La sintassi per definire una lista è:


'(a b c)


dove a, b, e c sono variabili. Si usa l'apostrofo (') per indicare che ciò che segue nelle parentesi è una lista di valori piuttosto che una funzione o un'espressione. Una lista vuota può essere definita come segue:

'()

o semplicemente:

()

Le liste possono contenere valori semplici così come possono contenere altre liste:

(let*
   (
        (x
           '("GIMP" (1 2 3) ("il" ("fotoritoccatore" () ) ) )
        )
    )
    x
)

Si noti che il primo apostrofo definisce elementi di lista fino alla corrispondente parentesi chiusa, e quindi tutte le coppie di parentesi interne rappresentano elementi di liste. Si copi l'istruzione nella console Script-Fu e la si esegua.

Sulle liste sono possibili le operazioni:

Esercizio:
Si acceda al numero 3 nella lista utilizzando solo due chiamate di funzione.

Commenti: In Scheme, un punto e virgola (;) indica un commento. Il segno stesso e quanto segue sulla stessa linea sono ignorati dall'interprete.


Creare uno Script

In questo esercizio si costruirà uno script per la creazione di un rettangolo con del testo. Lo script, intitolato Text Box, crea un'immagine delle dimensioni corrette per contenere una linea di testo immessa dall'utente. Si consentirà inoltre all'utente di scegliere il font, la sua dimensione e il suo colore.

Un programma composto da molte istruzioni non può trovare posto nella console Script-Fu.

Nella directory che GIMP crea durante l'installazione si dovrebbe trovare una directory denominata scripts. GIMP controlla in questa directory se esiste la directory scripts e aggiunge gli scripts contenuti in questa directory al database di Script-Fu. Perciò bisogna usare questa directory per memorizzare i propri script.

Lo stretto necessario

Ogni script Script-Fu definisce almeno una funzione che è la funzione principale dello script. Questa è la funzione dove si fa il lavoro. Inoltre ogni script deve registrarsi nel database delle procedure per poter risultare accessibile a GIMP.

Si definisca dapprima la funzione principale:

(define (script-fu-text-box inText inFont inFontSize inTextColor))

Subito dopo la parentesi tonda viene dato il nome della funzione: script-fu-text-box, poi seguono quattro parametri. Nel caso specifico questi corrisponderanno al testo, al font, alla dimensione del font e al colore del testo. Al momento la funzione è vuota e non fa nulla.

Nell'assegnazione dei nomi si preferisce usare lettere minuscole e separare le parti del nome con trattini (ved. il nome della funzione). Agli argomenti si è aggiunto il prefisso "in" in modo da distinguerli rapidamente come argomenti passati allo script piuttosto che creati al suo interno. Le variabili definite all'interno dello script sono precedute da "the".

Il prefisso script-fu davanti al nome della funzione rispetta una convenzione, quindi bisogna usarlo.

Per registrare la funzione si richiama la funzione script-fu-register. Quando l'interprete esegue questa funzione registra lo script nel database delle procedure. Pur non essendo obbligatorio, di solito, questa funzione viene scritta alla fine, dopo tutto il codice.

Ecco il listato per registrare questa funzione:

  (script-fu-register
    "script-fu-text-box"                        ; nome della funzione
    "Text Box"                                  ; voce che comparirà nel menu
    "Crea una casella con un testo, dimensionata\
     per adattarsi al testo che contiene,\
     al carattere, alla dimensione e al colore."; descrizione
    "Michele"                                   ;autore
    "copyright 2010, Michael Terry;\
      2009, the GIMP Documentation Team"        ; diritti d'autore
    "27 Ottobre 1997"                          ; data di creazione
    ""                     ;tipo di immagine su cui lavora lo script 
    SF-STRING      "Text"          "Text Box"   ; dichiarazione di variabile di tipo string
    SF-FONT        "Font"          "Charter"    ; Variabile per il font
    SF-ADJUSTMENT  "Font size"     '(50 1 1000 1 10 0 1)
                                                ; un pulsante
    SF-COLOR       "Color"         '(0 0 0)     ; variabile per il colore
  )
  (script-fu-menu-register "script-fu-text-box" "/File/Create/Text")

Salvare queste funzioni in un file di testo con estensione .scm all'interno della directory degli script, quindi si seleziona

Filtri → Script-Fu &rarr, Rinfresca gli scripts

questo nuovo script comparirà nel menu Filtri:

Filtri → Script-Fu → Text → Text Box.

Ovviamente, richiamando questo comando non succede ancora niente, tranne le richieste di parametri definite quando si registra lo script.

Per registrare lo script in GIMP si richiama la funzione script-fu-register, passando prima i sette parametri richiesti e poi gli argomenti dello script insieme con una descrizione e un valore predefinito per ciascun argomento.

Gli argomenti richiesti: