目次
Scheme
[Racket]
PLT Scheme
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にインストール
プログラムの要素
プログラムの要素 | 内容 |
---|---|
基本式 | 言語が関わるもっとも単純なもの |
組合せ法 | より単純なものから合成物をつくる |
抽象化法 | 合成物に名前をつけ、単一なものとして扱う |
式(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)という
合成手続き
- 手続き定義(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))
YAGI Hiroto (piroto@a-net.email.ne.jp)
twitter http://twitter.com/pppiroto
Copyright© 矢木 浩人 All Rights Reserved.