- 執行[影像] / 濾鏡 / Script-Fu / Console【註1】,會出現Script-Fu 訊息視窗,其下方的文字框內,可輸入欲執行的命令。
- 上圖展示了Script-Fu 訊息視窗,目前尚未輸入任何指令。
- 在GIMP裡,並沒有提供Scheme語言的除錯工具,造成了撰寫Script-Fu程式碼的不便,因此,後來有人發展了Perl、TCL、Python來控制GIMP的函式。
- 可在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,就變成沒有宣告,故有錯誤訊息。
- 請注意,左括弧與右括弧的對齊。
- 這條式子,可看成:
(x 3))
(y 5)
)
(* x y)
- 括號()特別多。
- 每一個完整的敘述(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