[Part I. GIMP基礎功]

[Part II. 一種效果的誕生]
[Part III. Script-Fu的秘密]

21.1 Script-Fu Console 與 Scheme 基本語法

Script-Fu 訊息視窗
  • 執行[影像] / 濾鏡 / Script-Fu / Console【註1】,會出現Script-Fu 訊息視窗,其下方的文字框內,可輸入欲執行的命令。

  • 上圖展示了Script-Fu 訊息視窗,目前尚未輸入任何指令。
  • 在GIMP裡,並沒有提供Scheme語言的除錯工具,造成了撰寫Script-Fu程式碼的不便,因此,後來有人發展了Perl、TCL、Python來控制GIMP的函式。


練習Scheme語言的語法
  • 可在Script-Fu 訊息視窗內,練習Scheme語言的語法。
  • 下圖是Script-Fu 訊息視窗的部份截圖,示範簡單的Scheme語法。

簡單的例子:

  • 在文字框內,輸入 (* 3 5) ,按下Enter鍵,得到15。
  • 輸入 (+ 6 7),按下Enter鍵,得到13。
  • 輸入 (- (* 3 5) (+ 6 7)),運算後,結果為2。
  • 輸入(let* ((x 3) (y 5))(* x y)),運算後,結果為15。
錯誤訊息:
  • 若再輸入 (* x y),會得到「錯誤訊息」。
  • 離開let* ()的括號外,原本已設定的區域變數x、y,就變成沒有宣告,故有錯誤訊息。


括弧要對齊
  • 請注意,左括弧與右括弧的對齊。
(let* ((x 3) (y 5))(* x y))

  • 這條式子,可看成:
(let* (
(x 3)
(y 5)
)
(* x y)
)


Scheme語法的規則

完整的敘述
  • 括號()特別多。
  • 每一個完整的敘述(statement),都要用括號()括起來。
  • 括號()內的第一項,一定是函數名稱或運算子。
  • (let* ((x 3) (y 5))(* x y)),是完整的敘述,括號要對齊。

註解
  • 分號;為註解符號。

運算式
  • 運算式為前序(prefix)運算式。
  • 運算式(* 3 5)相當於3*5。
  • 3*5是中序(infix)運算式。
  • 若你不習慣前序表示式,你可以將運算子視為函數。
  • * 視為函數,3、5視為參數。
  • 在中序運算式3*5, 運算子*與運算元3、5中間不會有空白(space);但前序運算式(* 3 5),*與3中間一定有空白。

前序運算式
  • (* 3 5)相當於3*5;(* 6 7) 相當於6*7。
  • ((- (* 3 5) (+ 6 7)) ((- (* 3 5) (+ 6 7)) 相當於3*5-6*7。

區域變數
  • 使用 let* ()來宣告與使用區域變數。
  • 語法:(let* (variables) expressions)
  • 以(let* ((x 3) (y 5))(* x y))為例子,左式設定 x=3、y=5,而後執行x*y的運算。
  • 離開let* ()的括號外,原設定的區域變數就變成沒有宣告。

函數定義、宣告與使用
  • 語法:(define (name param-list) expressions)
  • 使用define來定義函數。
  • name表示函數名稱。
  • param-list表示輸入函數的參數列。
  • 參數型態:參數不用設定參數型態,幾乎所有script語言都是如此。
  • 回傳值:函數內的最後一個敘述為回傳值。
  • (define (Multiply X Y) (* X Y) ),左式設定一個乘法函數
  • (Multiply 3 5) 得到15。
  • 猜猜看 (Multiply (Multiply 3 5) 2) 會得到多少?

串列
  • 語法:‘(a b c)
  • 使用撇號 ‘ 來定義串列,撇號是指apostrophe。
  • 例如:‘(1 6 8) ,撇號指示在括號內的是串列,不是單值。
  • 串列(list)相當於陣列,儲存多個單值。
  • (let* (x 5) x),在Script-Fu訊息視窗,鍵入左式得到5。
  • (let* (x ‘(1 6 8)) x) ,在Script-Fu 訊息視窗,鍵入左式得到(1 6 8)。
  • (let* (x ‘(“Gimp” 1.2 “v”)) ,串列的原素可以混合各種資料型態。

串接
  • 使用cons來連結串列產生新的串列
  • (cons “Gimp” (1 6 8) )
  • 上式的輸出結果:(“Gimp” 1 6 8)

抓取串列內元素
  • (car ‘(“Gimp” 2 3 4))
  • car抓取串列內第一個元素
  • 上式的輸出結果:”Gimp”

  • (cdr ‘(“Gimp” 2 3 4))
  • cdr抓取串列內除第一個元素外的其餘元素。
  • 上式的輸出結果:(2 3 4)

  • (car (cdr ‘(“Gimp” 2 3 4)))
  • car(cdr())抓取第二個元素
  • 上式的輸出結果:2


選單及項目名稱的英文:
【註1】[Image] / Filters / Script-Fu / Console