初めてのLispとの戦い

Lisp mode に変更する

Lips-interaction-mode に切り替えるには
Esc -x と打ちmini baffer にて 
Lisp-interaction-modeと入力する。
今、自分がどのモードに入るのかは、画面下の()内に
(Lisp Interaction)と表示されている。

(+ 1 2 3 4)

単純な四則演算について、
( 演算記号 数値)の規則で計算ができる。

(+ 1 2 3 4 ) ==> 10

なんだが普通の計算と順番が番うだろう。
だけどどちらが合理的かわかるかな?

君が命令するときに、1 + 2 + 3 + 4 と命令すると、
コンピュータは、1が入った時は、次の命令がなんだか
わかるまで動けないよね、
+が来てなんだ足し算をするのね。
それで、何を足すのか?と遊びの時間がでてしまう。
でもこんな風に命令すると、「足し算をしろ」
「1 2 3 4」なんてこられると、
足し算をしろという命令で足し算の計算準備ができていると
数字が来たときには、計算準備完了なんだ。
もし100000回くらい繰り返せばどっちが有利かわかるよね。

君の人生の秒数は?(* 20年 365日 24時間 60分 60秒)
として、この計算をlispにさせるには
(* 20 365 24 60 60)
で良いことにになる。

(* 20 365 24 60 60)

630720000

すごい数でしょ。こんな商売したら必ず儲かるよ。
こんな感じ、一円玉を1億個くらい用意するんだ。
そして参加費100万円で、この一円玉の数を正確に数えられた
人にその一円玉をあげるというゲームだ。
実はこの話には裏があって、参加者が「お前は本当に正しく数えたのか?」
と言われ、その一円玉を途方もなく眺めて一年経ったという話・・
でも人間は、意外と根性がないから1000まで数字をまちいなく順序正しく
言えたら1000円、10000までなら10000円あげるよと言っても
成功できるような人間はいないだろう。

(/ (* (- 80 20) 365 24) 3)

175200

(/ (* (- 80 20) 365 24) 3)はどんな計算か、
(/ (* (- 80歳 20歳) 365日 24時間) 3分の1)なのだ、
君は人生の1/3が睡眠時間なんて生活をしているよね、
多分8時間くらい寝ているんでしょ。
80歳までに175,200時間も寝るんだよ。 
うーん なんとかならんか・・
最近は老後の睡眠ではないが寝たきりの時間が多くて、
健康寿命が縮まっているようだが。


car cdr

形容詞 hot, thirsty, tired, fine, hungry,glad
これを並べてこのように表現してみよう。
(hot thirsty tired fine hungry glad)
ここから、このデータ群の先頭と後ろの部分を
定義することにする。
先頭を取り出すのに必要な命令は
car
後ろを取り出すのに必要な命令が
cdr
である。

(car (hot thirsty tired fine hungry glad)) ==> エラー

エラーが出る。理由は、lispがcarというコマンドと
その次のデータとの判別がつかないからだ。
ここは、一番大切なことなんだが、命令や変数、関数などは
その文字の組み合わせに、それぞれの役割があるから、
その通りコンピュータは動く。
メニューリストにない行動はしない。
当たり前だろ?
勝手に動くということを暴走という。
データは、データであるという宣言をしないとコンピュータは間違う、
コマンドだと勘違いすると、そのコマンドのプログラムを探し回るんだよ。
「どこにも、ないぜ・・」とエラーを返す。


宣言記号 「 ' 」

(car '(hot thirsty tired fine hungry glad)) ==> hot

きちんとデータと宣言したら、
データのリストとしてあつかったので
そのリストの一番先頭のデータを取り出し、
hot という答えを返した。

(cdr '(hot thirsty tired fine hungry glad))

==> (thirsty tired fine hungry glad)

cdr を実施したら、先頭のデータを取り除いた残りの
リストを返した。
よく見て欲しい、この返り値には( )が付いている。


だらだらと同じデータを入力するのは合理的ではない

から、ここらで、変数を作ってそこにデータを入れよう。
ただしlispは、文字列の組み合わせのタグが
データに紐付いているというイメージだと思って欲しい。
このイメージで注意して欲しいのは、
メモリに書いた番地が01番地に10が入っていたとしよう。
その10番地に紐付いた記号がtenとしたら、
tenを読み込んだlispは10番地まで行って、
10というデータを探してくる。

ten ----> 10番地 [10]::ten==10

もし、20番地にも10が入っていてten2
というタグが付いていたら
ten == ten2 が等しいという概念と
等しくないという概念が存在する。
等しいという概念は、 10==10であるという概念、
等しくない概念は、メモリ番地が違うから、
tenの10とten2の10ば別物であるという概念だ。
この概念は、uniq という考えではとても必要であり、
線形代数でも学んだと思うが真のデータはどこ



たとしたら、

(car '(a b c d e f))

a
(setq lis '(a b c d e f))
(a b c d e f)
lis
(a b c d e f)
(car (cdr lis))
b

(setq lis1 '(a b c d e f))

(a b c d e f)
(lis1)
lis1
(a b c d e f)
(car lis1)
a
(car (cdr lis1))
b
(car cdr cdr lis1)
エラー

(car (cdr (cdr lis1)))
c
きちんとカッコで囲もう!
(car (cdr (cdr (cdr lis1))))
d
(car (cdr (cdr (cdr (cdr lis1)))))
e
(car (cdr (cdr (cdr (cdr (cdr lis1))))))
f


(setq num1 '(1 2 3 4 5 ))

(1 2 3 4 5)
(setq num2 '(10 20 30 40 50))
(10 20 30 40 50)
(+ (car num1) 2)
3
(+ (car num1 )(car num2))
11
(/ 10000 60)
166

一つ小さな数を足す

n + (n-1)

(setq n 10)
10

(if (= n 100) "OK")
nil

"OK"





nil

(defun tasuyo (in)
(+ in (- in 1))
)
tasuyo
(tasuyo 20)
39
n

1つちいさな数をひく

(defun hikuyo (in)
(- in (- in 1)))
hikuyo
(hikuyo 80)
1
(hikuyo 0)
1











(b c d e f)

(cdr '(car '(a b c d e f)))
(car (cdr '(a b c)))
b

(setq good '(a b c))
(a b c)
(car (cdr good))
b
(cdr (cdr good))
(c)







I'm sorry. - No problem.


すいません - 大丈夫です。


まだ未完成だよ。 ごめんね


home