短く健やかに短く啓示的に...
おそらく、たぶん、おもう、〜だろう、〜かもしれない、などの言葉を挿入してしまってスパっとものを言い切ることができないとき、あなたの知識は足りていない。だとしたらググレカス、もしくはあやふやな部分をなくすために調査や実験をして、決定可能な箇所は決定すべきだ。言い切れないことからくる無駄な不安が文章から削除し、筋肉質な肉体をつくるなら、文章は短く健やかになる。
しかし、根拠を持って何かを決めようとすると、細部の記述や理由を述べる必要性が現れ、言葉はむしろ増えていく。だらだら細かすぎるのは、惰性で生きている人生みたいで、美しくない。人間は必ず死ぬのだと知っているなら、時間がない、暴れろ、些事は捨てろ、もがけ。細かすぎることを破棄しよう。大事な部分だけを抽象したり比喩をつくるれたなら、文章は短く啓示的になる。
このどちらの意味でも、文章を短くすることは、詩の価値感の中にあるものだ。詩人は若くして死に、詩とは短くて美しいものだ、と私たちは知っている。音楽と詩が重なったヴェン図がどんな霊感なのか、日々音楽を聴いて私たちが知っているのと同じことだ。素晴らしい音楽や言葉に喜んで洗脳されている、と言い換えてもいい。ニューロン脳内焼きじゅじゅじゅいいいい…
これを書いているとき聴いていた曲。一昨日からこの曲を繰り返し聴いている。離れられない。
クイックソート2
前にブログに貼り付けたクイックソートのコードをほんの少しだけ読みやすくしたい。内包表記の部分を書き換える。まずはhaskell。
-- 前 quicksort :: (Ord a) => [a] -> [a] quicksort [] = [] quicksort (x:xs) = let smallerSorted = quicksort [a | a <- xs, a <= x] biggerSorted = quicksort [a | a <- xs, a > x] in smallerSorted ++ [x] ++ biggerSorted -- 後 quicksort :: (Ord a) => [a] -> [a] quicksort [] = [] quicksort (x:xs) = let smallerSorted = quicksort (filter (<= x) xs) biggerSorted = quicksort (filter (> x) xs) in smallerSorted ++ [x] ++ biggerSorted
filterを使った。次はcommon lisp。
;; 前 (defun quicksort (lst) (if (null lst) () (destructuring-bind (x . xs) lst (let ((smaller (loop for i in xs when (< i x) collect i)) (bigger (loop for i in xs when (>= i x) collect i))) (concatenate 'list (quicksort smaller) (list x) (quicksort bigger)))))) ;; 後 (defun quicksort (lst) (if (null lst) () (destructuring-bind (x . xs) lst (let ((smaller (remove-if-not (lambda (i) (< i x)) xs)) (bigger (remove-if-not (lambda (i) (>= i x)) xs))) (concatenate 'list (quicksort smaller) (list x) (quicksort bigger))))))
loopをやめてfilter系の関数remove-if-notを使用した。common lispでの方が書き換えの効果は大きい気がする。
filter系の関数とmap系の関数を組み合わせて使えば内包表記を書き換えられるし、その逆もできるのだろう。haskellのghciを使ってみる。
-- 内包で生成 > [2*x | x <- [1..10]] [2,4,6,8,10,12,14,16,18,20] -- mapで生成 > map (2*) [1..10] [2,4,6,8,10,12,14,16,18,20] -- 上の2つは同じ > [2*x | x <- [1..10]] == map (2*) [1..10] True -- xはodd(奇数)である、という条件をつける > [2*x | x <- [1..10], odd x] [2,6,10,14,18] -- リスト[1..10]にfilterをかけてからmapを適用する > map (2*) (filter odd [1..10]) [2,6,10,14,18] -- 上の2つは同じ > [2*x | x <- [1..10], odd x] == map (2*) (filter odd [1..10]) True
引数として放り込むリストにfilter系関数で条件をつけて、それにmap系関数を適用することによって内包を表現する。
孤独な奴
私の孤独を耽溺しているやつがいる。奴は私より大きいけど、私の部屋よりも小さい。奴は私の部屋の扉よりも大きいから、部屋の外に出ていけないように感じるが、半透明の長方形なので壁をすり抜け逃げていけそうだな、とも感じる。
宗教書
「旧約聖書」「新約聖書」「コーラン」「古事記」は、折を見て読まなければいけない古典だな、と思いつつも私はまだ読んでいない。これらの書を読んでいないと「話にならない」と言う人は世の中にたくさんのいるとおもう。「話にならないこと」が大きな問題なような気がするから共通理解の方法として、読みたくなくても、理解しなければならない本はある。読んでおけばそれを背理法の前提として受け入れて矛盾を指摘することで、逆手を取ることもできる。感銘を受けてしまったらどうしよう? それは芸術だ。私はその言葉を素晴らしい詩だと思うだろう。それは私が読書に求めていることの一つだ。無料で日本語訳が読めるようなのでここにリンクを貼っておく。
コーラン(あるいはイスラーム文化のホームページにもある)
クイックソート
HaskellとCommon Lispの勉強をコッソリ少しずつ進めている。Haskellでクイックソートが簡単に書けるのを知って嬉しい。このサイトのコードを貼り付ける。
-- haskell quicksort :: (Ord a) => [a] -> [a] quicksort [] = [] quicksort (x:xs) = let smallerSorted = quicksort [a | a <- xs, a <= x] biggerSorted = quicksort [a | a <- xs, a > x] in smallerSorted ++ [x] ++ biggerSorted
common lispでも同じようなやり方でクイックソートを書いてみた。
;; common lisp (defun quicksort (lst) (if (null lst) () (destructuring-bind (x . xs) lst (let ((smaller (loop for i in xs when (< i x) collect i)) (bigger (loop for i in xs when (>= i x) collect i))) (concatenate 'list (quicksort smaller) (list x) (quicksort bigger))))))
上で使われているdestructuring-bindは構造化代入というらしいが、このやり方を見つけられてよかった。common lispでも関数の入力を分解して定義本体の語彙として使える。
;; common lisp (defun fff (lst) (destructuring-bind (x . xs) lst (cons x (cons x xs))))
-- haskell fff (x:xs) = x:x:xs
上の2つは同じ。でもhaskellの方が簡潔だ。
※クイックソート2