3. En Script-Fu-handledning

I denna träningskurs introducerar vi grunderna i Scheme som är nödvändiga för att använda Script-Fu, och bygger sedan ett praktiskt skript som du kan lägga till i din verktygslåda med skript. Skriptet efterfrågar text från användaren, och skapar sedan en ny bild vars storlek perfekt passar texten. Vi kommer sedan förbättra skriptet så det tillåter ett buffertutrymme runt texten. Vi kommer avsluta med några förslag om hur du kan förbättra din kunskap om Script-Fu.

[Notera] Notera

Detta avsnitt anpassades från en handledning som skrevs till användarhandboken för GIMP 1 av Mike Terry.

3.1. Bekanta dig med Scheme

3.1.1. Börja med Scheme

Scheme är en dialekt av Lisp-familjen av programspråk. GIMP använder TinyScheme som är en lättviktstolk för en delmängd av den så kallade R5RS-standarden.

Den första saken du behöver lära dig är att:

Varje sats i Scheme omgivs av parenteser ().

Den andra saken du behöver veta är att:

Funktionsnamnet/operatorn är alltid det första objektet i parenteserna, och resten av objekten är parametrar till funktionen.

Allt som är inneslutet av parenteser är dock inte funktioner — det kan också vara objekt i en lista — men vi kommer till det senare. Denna notation kallas prefixnotation, för funktionen kommer före allt annat. Om du är bekant med postfixnotation, eller äger en miniräknare som använder omvänd polsk notation (som de flesta HP-miniräknare), så bör du inte ha några problem att anpassa dig till att formulera uttryck i Scheme.

Den tredje saken att förstå är att:

Matematiska operatorer också anses vara funktioner, och listas därmed först då matematiska uttryck skrivs.

Detta följer logiskt från prefixnotationen som vi just nämnde.

3.1.2. Exempel på prefix-, infix-, och postfixnotation

Här är några snabba exempel som illustrerar skillnaderna mellan prefix-, infix- och postfix-notation. Vi adderar 1 och 23:

  • Prefixnotation: + 1 23 (sättet som Scheme vill ha det)

  • Infixnotation: 1 + 23 (sättet som vi vanligen skriver det)

  • Postfixnotation: 1 23 + (sättet som många HP-miniräknare vill ha det)

3.1.3. Öva i Scheme

I GIMP, välj FilterUtvecklingScript-FuScript-Fu-konsol från huvudmenyn. Detta kommer starta upp Script-Fu-konsolfönstret, vilket låter oss arbeta interaktivt i Scheme.

3.1.4. Script-Fu-konsolfönstret

Längst ner i detta fönster är ett textinmatningsfält för kommandon. Här kan vi testa enkla Scheme-kommandon interaktivt. Låt oss börja enkelt och addera några tal:

(+ 3 5)

Att skriva in detta och trycka Retur ger det förväntade svaret 8 i mittfönstret.

Figur 13.1. Använd Script-Fu-konsolen.

Använd Script-Fu-konsolen.

Funktionen + kan ta fler argument, så vi kan addera mer än ett tal:

(+ 3 5 6)

Detta ger också det förväntade svaret 14.

Allt väl så långt — vi skriver in en Scheme-sats och den exekveras omedelbart i Script-Fu-konsolfönstret. Men nu ett varningens ord…

3.1.5. Se upp för extra parenteser

Om du är som jag så är du van att kunna använda extra parenteser närhelst du vill — som när du skriver en komplex matematisk ekvation och vill skilja delarna åt med parenteser för att göra den tydligare då du läser den. I Scheme behöver du vara försiktig så att du inte sätter in dessa extra parenteser felaktigt. Säg exempelvis att vi vill lägga till 3 till resultatet av att addera 5 och 6:

3 + (5 + 6) + 7 = ?

Då du vet att +-operatorn kan ta en lista med tal att addera, så kanske du är frestad att konvertera det ovanstående till följande:

(+ 3 (5 6) 7)

Detta är dock felaktigt — kom ihåg, varje sats i Scheme börjar och slutar med parenteser, så Scheme-tolken kommer tro att du försöker anropa en funktion med namnet 5 i den andra gruppen parenteser, snarare än summera dessa tal innan de adderas till 3.

Det korrekta sättet att skriva satsen ovan skulle vara:

(+ 3 (+ 5 6) 7)

3.1.6. Se även till att du använder blanktecken korrekt

Om du är bekant med andra programspråk som C/C++, Perl eller Java, så vet du att du inte behöver blanktecken runt matematiska operatorer för att korrekt forma ett uttryck:

        3+5, 3 +5, 3+ 5
      

Dessa accepteras alla av C/C++-, Perl- and Java-kompilatorer. Detsamma är dock inte sant för Scheme. Du måste ha ett blanksteg efter en matematisk operator (samt alla andra funktionsnamn och operatorer) i Scheme för att den ska tolkas riktigt av Scheme-tolken.

Öva lite med enkla matematiska ekvationer i Script-Fu-konsolen tills du är helt bekväm med dessa inledande koncept.