elisp超入門
Amebaでブログを始めよう!
1 | 2 | 3 | 4 | 最初次のページへ >>

listの中の整数の最大値をとることをかんがえる。

今日は幾つかの整数を要素にもつlistから最大の整数を探す関数を考える。
ex.
(max '(2 3 5 1 3 4 2 7 4 3 2))
7

最大を考える前に注意!
lispのlistはcarとcdrの連続からなる。
listの最後はnilである。(一番後ろのcdrは空っぽ)
nilは数字でない。
だから困る。
だからnilも数字であるように振る舞わせなければならない。
さもなくば、そもそもlistの要素が1つの時を扱えない。
(要素が一のときは別のやり方でやる?いくらなんでもそれはかっこわるすぎる。)
まぁそこも考えないといけない。

だから今日考える問題は二つ。
最大をどう探すか?
list末尾のnilをどうするか?

最大をどう探すか?
そんなもん全部比べれば良いに決まってる。
小学生でも分かる。
計算機が全部調べてくれるはず。
問題は比べ方をどう表現するか??
どう命令するか考える。それがプログラムする人のお仕事。

例(数値例ではない)を挙げて考える。
仮に僕が小麦畑に立っていてるとする。
その小麦畑には沢山の子供がはしゃぎ回っている。
でも僕はそのはしゃぎ回っている子供達のなかから一番背の高いやつを捕まえなきゃいけないんだ。
僕はとりあえず一番近くにいる子供を捕まえた。(car hoge)
そしてもう少し、、

うまく説明できない
じっさいコードを表現したときは何も考えてないときが多いからさ、説明できないんだぁ。
まぁ今日はこれを使って再帰のすごさを非lispの人々に知らしめようと考えたのに。

(defun k-max (hoge)
(if(eq (cdr hoge)nil) (car hoge)
(if (>= (car hoge) (k-max (cdr hoge)))(car hoge)
(k-max (cdr hoge)))))
まあいい。
ライ麦畑はあきらめて、テキトウな順番に一列で並んだ小学生を考えよう。
一番順番がびりの奴は基準になれってこと。 (if(eq (cdr hoge)nil) (car hoge)
それはそうと前の奴と背を比べろ、それで高かったら、もしかすると一番背が高いかもしれないし違うかもしれない。 (>= (car hoge) (k-max (cdr hoge)))
はい!ここの再帰をどう言葉で説明する。
出来ない!!!
よって日本語はlispより表現の抽象度が劣ることが再び明らかになった!
よってlispは最強だ。
まぁ紙と鉛筆でぐにゅぐにゅ再帰のイメージを書けば少しは伝わるのかもなぁ。

あぁ、やっぱり数値例使おう!


(defun k-max (hoge)
(if(eq (cdr hoge)nil) (car hoge)
(if (>= (car hoge) (k-max (cdr hoge)))(car hoge)
(k-max (cdr hoge)))))

この式が経験とひらめきにより与えられたとする。

(koki-max '(5 7 4 ))

を実行すると
まず(5,(7 4 ))
だから(eq (cdr hoge)nil)は偽
でひとまず5と(k-max (cdr hoge))の比較に飛ぶ。
でも(k-max (cdr hoge)が分からないとどうにもならないので、
計算機は(k-max (cdr hoge)を評価する
(k-max (7 4))

ぁあ、考えるだけできもくなって来た。
再帰している式の展開を考えると恐ろしくなる。
てかこんな序長てきな表現を避けるために再帰にしたのに、
日本語の抽象度が低いばっかりにこんなことに!

もうやめた。

だって見たまんまジャン。

(defun k-max (hoge)
(if(eq (cdr hoge)nil) (car hoge)
(if (>= (car hoge) (k-max (cdr hoge)))(car hoge)
(k-max (cdr hoge)))))
きっとライ麦畑ではしゃぐ子供達をたちから一番背の高い少年を探し出す時君の脳ではこれと似たような処理がなされているはず。

lispの1行の偉大さが証明された。

collatz-in-elisp

;; collatz jul 17 2007 collatz

(defun dablle (i)
(if (= i (* 2 (/ i 2))) t nil))

(defun collatz (hoge)
(print hoge)
(if (= hoge 1)(print "end")
(if (dablle hoge)
(collatz (/ hoge 2))
(collatz (+ 1 (* 3 hoge))))))

lispの基本要素について  式とアトムの関係

ここではlispっぽいことを説明します。
ここから先はもう式とlistを別けて考えないと思いますが、今までかいたことは重要なので心の隅に置いといて下さい。

いきなり結論を言います。

式はアトムになりうる

いやぁもう説明しようとしたことを全て言ってしまった。
まぁ正確には少し違う気もするがまぁこの理解のしかたで困ることは滅多に無いさ。
せっかくだからもう少し説明しよう!

(+ 7 (* 3 5) )

この式を実行する時処理系は内側の括弧から順番に評価(実行)する。

つまり、まず、(* 3 5)を評価して
その結果を(+ 7 (* 3 5))に渡す。
そして(+ 7 15)が評価され
22と言う結果になる。

まぁ式も基本的にはアトムのように扱えるってこと。

まとめ
式とはアトムになりうる。
内側の式から順に評価される。
1 | 2 | 3 | 4 | 最初次のページへ >>