Schemeを覚える1

http://www.shido.info/lisp/idx_scm.html
↑このサイトに親切な説明が載っていたのでちょとずつ勉強

UbuntuSchemeを動かすためのソフトを入れる

$ sudo apt-get  install drscheme 
$ drscheme <これで起動できる


四則演算

> (* (+ 3 4) (- 5 2))
21

浮動小数点に変換

> (exact->inexact (/ 1 3))
0.3333333333333333

(普通に割り算だけだと分数になる1/3みたいな)

コンスセル

http://www.shido.info/lisp/scheme3.html
コンスセルとは、アドレスを2つ入れられる入れ物。
(cons 1 2)とかく。
1が入っている部分をcar、2が入っている部分をcdrと呼ぶ。

> (cons 1 (cons 2 (cons 3 4)))
(1 2 3 . 4)

コンスセルは入れ子にできる。
この辺からもう忘れそう
(1 2 3 . 4)は(1 . (2 . (3 . 4)))の省略系

リスト

一番最後のコンスセルが'()だったらリストと呼ぶ。

> (cons 1 (cons 2 (cons 3 '())))
(1 2 3)

お。リストっぽく表示された。

quote

リストやリテラルを作るときに使う?取り合えずこんな覚え方。これを使うと式として評価されない。

> (quote (1 2 3 4))
(1 2 3 4)

> (quote (1 2 3 4))
(1 2 3 4)

省略形(シングルクォーテーションをつける)
> (quote (1 2 3 4))
(1 2 3 4)
> '(* (+ 3 4) (- 5 4))
(* (+ 3 4) (- 5 4))

関数のcar, cdr

コンスセルのcarの部分、cdrの部分を取得するための関数

> (car '(5 4 3))
5
> (cdr '(5 4 3))
(4 3)

上の例の(5 4 3)というリストは、実際は、(cons 5 (cons 4 (cons 3 '()))という感じのリストなので、(cdr '(5 4 3))とすることで、コンスセルの2つ目の(cons 4 (cons 3 '())が返されることになる。

関数

> (define hello
    (lambda (name)
      (string-append "hello " name))) ; ここまでが関数定義
> (hello "hironemu") ; 関数を使ってみたところ
"hello hironemu"

defineのあとの「hello」が関数名。lambdaの後に(name)が引数。ここはリストになる。(name age address)見たいな感じにかける。
lambdaは省略できる↓

> (define (hello name)
    (string-append "hello " name))
> (hello "hironemu")
"hello hironemu"

だめだ、、疲れた。繰り返しのとこまでやったのにメモりきれない。続きは明日。
それまでにわすれてそーーー。ひぃ