スクリーンショット_2019-07-28_0

コンピューターが処理する計算

7月26日金曜日、晴れ

いや。でも曇ってた気もするし、帰り道は道路が濡れていた。
あれ? 降った?(いまはパラパラ降っている)

* * *

同僚の書くコードで「う〜ん、それは無いんじゃないかなあ?」と感じることがあって、困る。まあ困るといい条、「こうしたらどうでしょう?」と言ってしまうので、どちらかというと困られているに違いない。

基本的に、省略できるところは省略する。これが大方針。

書かなくて済むところは書かない。自分が書くコードは最低限。
利用するライブラリーも必要最小限に止める。

足さない。むしろ引く。
値を変えない。スコープは短く切る。
短くて明快な名前をつける。
共通化する。コピーしない。

単純で明快なルール、だとおもうんだけれど、あまり共感されていないのかな……?

* * *

『アンダースタンディング・コンピュテーション』の6章で、ラムダ計算を扱っている。『計算機プログラムの構造と解釈』でも出てきた、データ構造を手続きで実装するというネタが出てきて懐かしくもある。

例えばふたつの値の組をつくる手続きは(JavaScript で書くなら)

PAIR = x => y => f => f(x)(y)

この手続きをつかって作られた組の一方を取り出す手続きは

LEFT = p => p (x => y => x)

同じくもう一方を取り出す手続きは

RIGHT = p => p (x => y => y)

たとえば ("hello", "world") という組を作りたければ

PAIR ("hello") ("world")

と呼び出す。この組から "hello" を取り出したければ

LEFT (PAIR ("hello") ("world"))

として、 "world" を取り出したいなら LEFT の代わりに RIGHT を適用すればよい。

ためしに LEFT (PAIR ("hello") ("world")) を評価してみる。

LEFT (PAIR ("hello") ("world"))
=
(p => p (x => y => x)) (PAIR ("hello") ("world"))
=
(PAIR ("hello") ("world")) (x => y => x)
=
PAIR ("hello") ("world") (x => y => x)
=
(x => y => f => f(x)(y)) ("hello") ("world") (x => y => x)
=
(y => f => f("hello")(y)) ("world") (x => y => x)
=
(f => f("hello")("world")) (x => y => x)
=
(x => y => x) ("hello") ("world")
=
(y => "hello") ("world")
=
"hello"

たのしい。


この記事が気に入ったらサポートをしてみませんか?