トップ 一覧 ping 検索 ヘルプ RSS ログイン

Schemeの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!Scheme

[Racket]
{{amazon 489471163X}}
*http://mitpress.mit.edu/sicp/

!!PLT Scheme
*http://plt-scheme.org/
*http://racket-lang.org/
*http://docs.racket-lang.org/
*DrScheme

!Ubuntu にインストール
 $ apt-cache search racket
 $ apt-cache show plt-scheme
 $ apt-cache policy plt-scheme
 plt-scheme:
   インストールされているバージョン: (なし)
   候補:               5.2.1+g6~92c8784+dfsg2-2+deb7u1
   バージョンテーブル:
      5.2.1+g6~92c8784+dfsg2-2+deb7u1 0
         500 http://jp.archive.ubuntu.com/ubuntu/ quantal/universe i386 Packages
 $ sudo apt-get install plt-scheme
!CentOSにインストール
*Racket をCentOS にインストール
!!!プログラムの要素
,プログラムの要素,内容
,基本式,言語が関わるもっとも単純なもの
,組合せ法,より単純なものから合成物をつくる
,抽象化法,合成物に名前をつけ、単一なものとして扱う

!!式(expression)
*式(expression)を入力すると解釈系は応答してその式を評価した(evaluating)結果を表示する
::整数を与えると、応答を印字
 > 486
 486
::手続き(+や*など)と組み合わせて合成式とし、手続きの作用を表現
 > (+ 137 349)
 486
 > (* 5 99)
 495
!組合せ、演算子、被演算子、引数
*式の並びを括弧で囲んで手続きの作用を表現する式を組合せ(combinations)という
*左端の要素を演算子(operator)、他の要素を被演算子(operands)という
*組合せの値は、演算子が指定する手続きを、被演算子の値である引数(arguments)に作用させて得る
!前置記法
*演算子を被演算子の左に置く書き方を前置記法(prefix noations)という
::利点
*任意の引数をとる手続きを許す
 > (+ 21 35 12 7)
 75
*組合せを入れ子にする(nested)ことを許す
 > (+ (* 3 5) (- 10 6))
 19

!!名前と環境
*オブジェクトを値(value)とする変数(variable)を識別するのものが名前
*defineで名前付け
 > (define size 2)
 > size
 2
!!組合せと評価
+組合せの部分式を評価する
+最左部分式の値である手続き(演算子)を、残りの部分式の値である引数(被演算子)に作用させる
!特殊形式(special forms)
*define は、2つの値に作用させるのではなく、対応づけるだけのため、(define x 3) は組合せではない
*このような一般評価規則の例外を特殊形式(special forms)という

*http://typea.info/blg/glob/2010/03/_3.html
!!合成手続き
*手続き定義(procedure definetions) により、合成演算に名前を対応付け、一体として指すことができる

::二乗を表すsquare という合成手続き(compund procedure)を作る
 > (define (square x) (* x x))
 > (square 2)
 4
!!条件式と述語
!場合分け(case analysis)
*cond 場合分けを記述する特殊形式
 > (define (abs2 x)
    (cond ((> x 0) x)
          ((= x 0) 0)
          ((< x 0) (- x))))
 > (abs2 -19)
 19
 > (abs2 0)
 0
*特殊記号 else を利用できる
 > (define (abs3 x) 
     (cond ((< x 0) (- x))
           (else x)))

*場合分けが2つの場合、特殊形式の if を利用できる
 > (define (abs4 x)
     (if (< x 0)
         (- x)
         x))
::論理合成演算
*基本的述語以外に、以下のような論理合成演算が利用できる
,論理合成演算
,(and <e1> ... <en>)
,(or <e1> ... <en>)
,(not <e>)
!!!手続きと変数
!!変数と有効範囲
!束縛変数(bound variable)
*手続き定義のなかで、仮パラメータはどんな名前でもかまわないし、名前をすべて変更しても手続きの意味は変わらないという意味で、手続き定義は、仮パラメータを束縛している(bind)。そういう名前を束縛変数(bound variable)という。変数が束縛されていなければ、自由である(free)。
!有効範囲(Scope)
*名前が束縛されている式の範囲
!ブロック構造(block structure)
*定義の入れ子。単純な名前保護の機構。
*手続きの定義の中で別の定義を行うことができる。
 (define (sqrt2 x) 
   (define (average x y) (/ (+ x y) 2))
   (define (square x) (* x x))
   (define (good-enough? guess x)
     (< (abs (- (square guess) x)) 0.001))
   (define (improve guess x)
     (average guess (/ x guess)))
   (define (sqrt-itr guess x) 
     (if (good-enough? guess x)
         guess
         (sqrt-itr (improve guess x)
                   x)))
   (sqrt-itr 1.0 x))
!静的有効範囲(lexicacl scoping)
*上記例で、x は、sqrt2 の定義に束縛されている。なので、その内側の関数は、x の有効範囲内にあるため明示的に渡さなくてもよいので、自由変数にできる。こうしたやり方を静的有効範囲(lexical scoping) という。
 (define (sqrt2 x) 
   (define (average a b) (/ (+ a b) 2))
   (define (good-enough? guess)
     (< (abs (- (* guess guess) x)) 0.001))
   (define (improve guess)
     (average guess (/ x guess)))
   (define (sqrt-itr guess) 
     (if (good-enough? guess)
         guess
         (sqrt-itr (improve guess))))
   (sqrt-itr 1.0))