| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

「Scheme」の版間の差分

提供: MyMemoWiki
ナビゲーションに移動 検索に移動
(ページの作成:「==Scheme== [Racket] {{amazon|489471163X}} *http://mitpress.mit.edu/sicp/ ===PLT Scheme=== *http://plt-scheme.org/ *http://racket-lang.org/ *http://docs.racket-la…」)
 
1行目: 1行目:
 
==Scheme==
 
==Scheme==
[Racket]
+
[[Racket]]
 
{{amazon|489471163X}}
 
{{amazon|489471163X}}
 
*http://mitpress.mit.edu/sicp/
 
*http://mitpress.mit.edu/sicp/
42行目: 42行目:
 
*式(expression)を入力すると解釈系は応答してその式を評価した(evaluating)結果を表示する
 
*式(expression)を入力すると解釈系は応答してその式を評価した(evaluating)結果を表示する
 
=====整数を与えると、応答を印字=====
 
=====整数を与えると、応答を印字=====
  > 486
+
  > 486
 
  486
 
  486
 
=====手続き(+や*など)と組み合わせて合成式とし、手続きの作用を表現=====
 
=====手続き(+や*など)と組み合わせて合成式とし、手続きの作用を表現=====
  > (+ 137 349)
+
  > (+ 137 349)
 
  486
 
  486
  > (* 5 99)
+
  > (* 5 99)
 
  495
 
  495
 
====組合せ、演算子、被演算子、引数====
 
====組合せ、演算子、被演算子、引数====
57行目: 57行目:
 
=====利点=====
 
=====利点=====
 
*任意の引数をとる手続きを許す
 
*任意の引数をとる手続きを許す
  > (+ 21 35 12 7)
+
  > (+ 21 35 12 7)
 
  75
 
  75
 
*組合せを入れ子にする(nested)ことを許す
 
*組合せを入れ子にする(nested)ことを許す
  > (+ (* 3 5) (- 10 6))
+
  > (+ (* 3 5) (- 10 6))
 
  19
 
  19
  
66行目: 66行目:
 
*オブジェクトを値(value)とする変数(variable)を識別するのものが名前
 
*オブジェクトを値(value)とする変数(variable)を識別するのものが名前
 
*defineで名前付け
 
*defineで名前付け
  > (define size 2)
+
  > (define size 2)
  > size
+
  > size
 
  2
 
  2
 
===組合せと評価===
 
===組合せと評価===
81行目: 81行目:
  
 
=====二乗を表すsquare という合成手続き(compund procedure)を作る=====
 
=====二乗を表すsquare という合成手続き(compund procedure)を作る=====
  > (define (square x) (* x x))
+
  > (define (square x) (* x x))
  > (square 2)
+
  > (square 2)
 
  4
 
  4
 
===条件式と述語===
 
===条件式と述語===
 
====場合分け(case analysis)====
 
====場合分け(case analysis)====
 
*cond 場合分けを記述する特殊形式
 
*cond 場合分けを記述する特殊形式
  > (define (abs2 x)
+
  > (define (abs2 x)
     (cond ((> x 0) x)
+
     (cond ((> x 0) x)
 
           ((= x 0) 0)
 
           ((= x 0) 0)
           ((< x 0) (- x))))
+
           ((&lt; x 0) (- x))))
  > (abs2 -19)
+
  &gt; (abs2 -19)
 
  19
 
  19
  > (abs2 0)
+
  &gt; (abs2 0)
 
  0
 
  0
 
*特殊記号 else を利用できる
 
*特殊記号 else を利用できる
  > (define (abs3 x)  
+
  &gt; (define (abs3 x)  
     (cond ((< x 0) (- x))
+
     (cond ((&lt; x 0) (- x))
 
           (else x)))
 
           (else x)))
  
 
*場合分けが2つの場合、特殊形式の if を利用できる
 
*場合分けが2つの場合、特殊形式の if を利用できる
  > (define (abs4 x)
+
  &gt; (define (abs4 x)
     (if (< x 0)
+
     (if (&lt; x 0)
 
         (- x)
 
         (- x)
 
         x))
 
         x))
110行目: 110行目:
 
!論理合成演算
 
!論理合成演算
 
|-
 
|-
|(and <e1> ... <en>)
+
|(and &lt;e1&gt; ... &lt;en&gt;)
 
|-
 
|-
|(or <e1> ... <en>)
+
|(or &lt;e1&gt; ... &lt;en&gt;)
 
|-
 
|-
|(not <e>)
+
|(not &lt;e&gt;)
 
|-
 
|-
 
|}
 
|}
130行目: 130行目:
 
   (define (square x) (* x x))
 
   (define (square x) (* x x))
 
   (define (good-enough? guess x)
 
   (define (good-enough? guess x)
     (< (abs (- (square guess) x)) 0.001))
+
     (&lt; (abs (- (square guess) x)) 0.001))
 
   (define (improve guess x)
 
   (define (improve guess x)
 
     (average guess (/ x guess)))
 
     (average guess (/ x guess)))
144行目: 144行目:
 
   (define (average a b) (/ (+ a b) 2))
 
   (define (average a b) (/ (+ a b) 2))
 
   (define (good-enough? guess)
 
   (define (good-enough? guess)
     (< (abs (- (* guess guess) x)) 0.001))
+
     (&lt; (abs (- (* guess guess) x)) 0.001))
 
   (define (improve guess)
 
   (define (improve guess)
 
     (average guess (/ x guess)))
 
     (average guess (/ x guess)))

2020年2月15日 (土) 08:05時点における版

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にインストール

  • 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

組合せと評価

  1. 組合せの部分式を評価する
  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))