Scheme note

本網頁以打造無障礙閱讀為目標,可以用任何瀏覽器來觀看本網頁


簡介(Introduction)

Scheme語言的標準

R5RS(Revised(5) Report on the algorithmic language Scheme)

R5RS 為現有Scheme語言的標準,於1998年制訂 Scheme語法規則的第5次修正

Scheme語言的實作版本

Scheme 是一種 Lisp 方言,目前的規範是 R5RS,和 C 語言一樣,同樣的規格書有不同的實作, 每個實作在標準之上可以再加一些特色或函式庫等。

語法(Syntax)

註解

Scheme的標準中僅有單行註解:「; 」(分號) ,但實作的眾多Scheme版本卻幾乎都有多行註解,例如Guile的 「#! 」,「 !# 」(一定要分2行)

以scheme作script語言

要像sh, perl一樣運用Scheme作為script 語言,一般是以Guile來直譯,副檔名一般為 「.scm 」。

#! /usr/local/bin/guile -s
!#

要在 Guile 上使用readline的快速鍵 (ctrl-a ctrl-e ctrl-w),必須在 ~/.guile 檔加入

(use-modules (ice-9 readline))
(activate-readline)

定義變數

(define id exp)

(define pi 3.14159)

變數設值

(set! id exp)

(set! pi "hello")

資料型態(Types)

Scheme的資料型態如同python,perl,VBscript一樣,可隨時變更變數的資料型態

單一型態(Simple Types)

複合型態(Composite Types)

string:由多個字元所組成

>(define name "peter") ;定義字串變數name
>name
"peter"
>(string-length name)  ;字串變數name的長度
5
>(string-ref name 3)  ;字串變數name第3個位置的字元
#\e

list (串列):在Scheme中的基本結構資料型態,其內的資料型態不必相同

pair (點對):

檢查型態為何(Type Predicates)

敘述句與流程控制

邏輯運算式(Boolean Expressions)

  1. (< 5 6) (<= 5 6) (= 5 6) (> 5 6) (>= 5 5)
  2. (equal? "abc" "abc") //是否資料的內容完全相同
  3. (eq? "abc" "abc") //是否指向同一個物件

條件運算式(Conditional Expressions)

  1. if : 單一判斷
    (if (> 6 5) ; 判斷式
         (* 3 5) ; 為真
         (* 8 9)) ; 為假
  2. cond : 多重判斷
    (cond
     ((< n 0) 'lower)
     ((> n 0) 'upper)
     (else 'equal)
    )

函數(Functions)與程序(Procedure)

函數也只是list的一種解釋方式,list可以是資料或是程式,程式可以當成資料處理,處理完的資料也可以變成馬上執行的程式

定義一個函數或程序

(define id exp)

>(define (f2c t) (* 5/9 (- t 32)))

>(define singleton (cons 'sample null))
>singleton
(sample)

變數設值 (set!)

(set! id exp)

(set! pi "hello")

定義一個不具名的函數或程序

(lambda (id.....) exp)

定義一個可傳入參數的的函數或程序(結合define與lambda)

定義一個square的函數

正式定義函數 簡化定義函數 範例 結果
(define square
 (lambda
(x)
  
(* x x)))
(define (square x)
 
  (* x x))
(square 5) 25

定義一個reciprocal的函數

正式定義函數 簡化定義函數 範例 結果
(define reciprocal
 (lambda (n)
  (if (= n 0)
   "oops!" (/ 1 n)
  )
 )
)
  (reciprocal (reciprocal 10)) 10

(eval運算式)

eval可以接受list當參數,然後評估其值,list內的變數,只能參照外層設定

>(set! x 3 )
>(define (f x) (eval '(print x)))
>(f 4)
3

(mapcar 函數 list1 list2 ... listn )

將函數作用在list中的每一個元素,然後將結果回傳

>(set! x 3 )
>(define (f x) (eval '(print x)))
>(f 4)
3

(length list)

傳回指定list的長度

>(define x (list 3 4 5))
>(length x)
3

變數(Variable)

(let (變數=變數的值的list) (運算式))

例如:x=3; y=2; x+y=?

(let
 ((x 3) (y 2))
 (+ x y)
)

((lambda (變數)(運算式))變數的值)

例如:x=3; y=2; x+y=?

(
 (lambda (x y) (+ x y))
 3 4
)

錯誤訊息

相關名詞

imperative language 命令導向式語言
functional language 函數導向式語言
algebraic simplifications 代數的簡化
lambda calculus 微積分
descendent 後代子孫,衍生物
genesis 起源
dialect 同樣來源,方言的
parenthesis(paren.)/parenteses 小括號/複數型
bracket 括號或中括號
commas 逗號
quote 引號
semicolon 分號

網路資源 (Resource)

主 網 站:http://peterju.notlong.com (目前轉址至 http://irw.ncut.edu.tw/peterju/) Sitetag Logo

Level Triple-A conformance icon | [歡迎使用任何作業系統、瀏覽器觀看!] | Valid XHTML 1.0 Transitional | Valid CSS! | [Valid RSS] | [創意公眾許可証]
This work is licensed under a Creative Commons License