維基百科也有資訊

完整的敘述
 

  • 括號()特別多。

  • 每一個完整的敘述(statement),都要用括號()括起來。

  • 括號()內的第一項,一定是函數名稱或運算子。

  • (let* ((x 3) (y 5))(* x y)),這是一句完整的敘述。

  • 前一條式子可看成:


(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





完整的敘述
每一個完整的敘述(statement),都要用括號()括起來。
括號()內的第一項,一定是函數名稱或運算子。
(類似C語言行末要用分號;結尾的意思)



註解 ;(分號)
分號後接的文字都視為註解。



變數宣告

1.使用define宣告的話會變成全域變數
(define variable value)

2.使用let宣告
(let ((var1 val1) (var2 val2) ...))



函數
1. (define (func arg1 arg2 ...) ...)
2. (define func (lambda (arg1 arg2 ...) ...))



條件判斷

1.(if test then-expr else-expr)
如果test為真,則執行then-expr這個表達式,要不然就執行else-expr這個表達式。

2.(cond (test1 expr1...)
(test2 expr2...)
...
(else expr))
如果test1為真,則執行expr1。test2為真,執行expr2。要是都不符合的話,就執行expr。



Scheme 的 hello, world 程式
(write "hello, world")



null? test
test為list型態
如果test是null,則傳回true,否則傳回false。
http://www.math.grinnell.edu/~stone/scheme-web/null-ques.html

EX:
> (null? '())
#t
> (null? '(3))
#f
> (null? (cons 1 2))
#f
> (null? (cdr '(3)))
#t
> (null? (cdr (cons 3 '())))
#t



eqv? obj1 obj2
判斷兩object是否相同。
http://people.csail.mit.edu/jaffer/r5rs_8.html
arrow
arrow
    全站熱搜

    伊 發表在 痞客邦 留言(0) 人氣()