とある京大生の作業ログと日々の雑記

コンピュータサイエンスについて学んだことを可視化したり日々の雑記をまとめてます。

ぼくは恋をしている

こんにちは!コミさん(@komi_1230_edtr)です!





留学生活はとても順調で、それなりに楽しく過ごしてます。




この前はEPFLのパーカーも買っちゃったりしました。




f:id:komi1230:20180921181026j:plain




EPFLはいい大学だよ、ほんと。




さて突然ですが、みなさんは初恋のときの気持ちを覚えていますでしょうか?




きっと小学生のときや中学生のときに「あぁあの人かわいいな、かっこいいな」と思って気がついたらその人のことを考えている、そんな経験があると思います。




もちろんぼくもその経験があります。




結果としては告白して振られましたがね...




人間とは不思議なもので、出会いがたくさんあれば確率的に好きな人ができるわけで、またときめくわけですよ。




好きな人ができると人生はとても色付き始めます。




特に何かしたわけでもないのに生きてて楽しい、日々の光景が輝いて見えるのです。




まあそんな感じで前置きが長くなりましたが、何が言いたいかと言うと、




スイスに来て約1ヶ月、ぼくもとうとう好きな人ができ、今は立派に交際しております。




突然の報告ですねw




出会ってからコミュニケーションをとるうちに、「あ、こいつとはスゴい気が合うんだな」って直感が働き、今や日々一緒に過ごしています。




それだけものすごい気が合うし、日々一緒に過ごすうちにいいところがどんどん見つかっていって、とても楽しい留学生活を送れています。




出会えたことに感謝しかないし、これからの人生で一生大切にしていこうと思います。




今回は特別に写真を載せていいということで、写真を載せちゃいます。




こんな感じです↓








f:id:komi1230:20180921181641p:plain




Lispです。




今はこいつのおかげで人生が輝いてます。もう、ホントに。




以下ではぼくがいかにLispにベタ惚れするに至ったかについてまとめていきますね。



馴れ初め






ぼくがLispに出会ったのは大学2回生の頃ですね。




プログラミングを始めたのは京大に受かって、入学までの1ヶ月間がめちゃくちゃ暇で、それでずっと興味があったプログラミングをやってみようということでC言語から始めました。




もちろん、最初のプログラミング始めたてなのでオブジェクト指向とか一切知らないし、とにかくプログラミングの空気感を掴むことが先決だったのでメモリとかポインタなんて全く理解してませんでした。




まあそんなこんなで1年間C言語を触ってて、なんとなく色々理解してきたあたりで他の言語をやろうってことでPythonに走りました。




Pythonぼくにとっての第二プログラミング言語だったのですが、動的型付けとかがいかに便利か、脳死でもコードを書けるではないかと驚愕しました。




で、日立で働いてたときに機械学習をやっててPythonばっかり触ってて少し飽きてきて、それを上司に相談したところ「ちょっと他の言語を触ってみたらどうだろう、関数型言語とか最近流行ってるよ」と。




ぼくはそこで手を出したのがLispでした。




もちろん、関数型言語というとHaskellの方がイメージされがちですけど、なぜかぼくはそこでHaskellではなくLispに手を出しました。




理由としては、偶然書店をブラブラしてたときにオライリーから出てるLand of Lispを見かけ、これはなんか面白そうと思ったのが最初の出会いです。




ひょっとしたら運命だったのかもしれませんね(?)




ただ、実を言うとそのときLispにはあまりハマりませんでした。




というのも、日立で担当してたプロジェクトの方が山場でそっちをどう片付けるかとか、留学準備とかでバタバタしてた時期であんまりLispをガッツリやることができず、結局放置してました。




これがだいたい2018年の1月とかそこらへんの話ですね。




まあそれで半年ほど時間が経つのですが、留学が始まるということで日立を退職する際に上司と「コンピューターサイエンスを修めたいというのであれば何を読むべきか」という話になり、そこで出てきたのがSICPです。




SICPとはMITの教科書になっていたStructure and Interpretation of Computer Processingで、アルゴリズムからコンピュータの動作原理を抑えた名著で、そこで使われている言語がSchemeというLispなんですね。




読むべき本としてPRMLとかパタヘネ・へネパタ、K&Rあたりも挙がったのですが、とにかく全体像を俯瞰するならSICPがいいんじゃないかということでした。




それで留学が開始し、スイスに来て割と暇だということでぼくはSICPを読み始めました。




1日8時間くらい読んで、だいたい3週間くらいで読み終わりましたね。




そこでですね、ぼくはちょっと目覚めたわけです。Lispにね。



ぼくの中で何かが覚醒し始めた






SICPLispの教科書というよりLispを使ったコンピュータサイエンスの教科書という方が正確です。




ということでLispの強みであるマクロについてはそこまでガンガン登場しないんですよね。




だからSICPを読んだからといってLispの真髄に触れたというわけではないんです。




で、ぼくの中で何かが覚醒し始めたのはPractical Common Lispという本を読み始めてからです。




この本に手を出したのは「SICPをせっかく読み切ったしLispにも興味が湧いてきたからちょっと本格的にLispで開発をしてみよう」というちょっとした好奇心からですね。




ちょうど「プログラマ 本 おすすめ」などと検索をかけて無料で手に入るPDFを漁っていたときにPractical Common Lispを手に入れました。




まあそんなこんなでPractical Common Lispを読み始めたんですけど、Common Lispを書くエディタとしてぼくはVimを使ってたんです。




もともとVimmerでエディタとしては基本VimでたまにAtomを使うような感じだったんですけど、せっかくCommon Lispを触るのだからSLIMEの恩恵を受けようということでぼくはSlimvを使っていました。




ただ、これが想像以上にモッサリしていて、REPLとか遅くて使えたもんじゃなかったんですよね....(多分いじくりまわせばなんとかなったのかも)




ただぼくはそこまで環境構築に明るくなくて、ということで他のエディタに乗り換えることにしました。




エディタの乗り換え先としてEmacsを考えたのですが、Vimmerだっただけにモードの切り替えとかキーバインドが完全にVimのそれに適応してたのでEmacsに改宗するのはちょっと気が引けました。




ただ、EmacsにしないとSLIMEをエンジョイできない....




そんな葛藤の中、調べていたところ出会ったのがSpacemacsというやつです。




f:id:komi1230:20180921185523p:plain




これはEmacsVimのハイブリッドのようなやつで、基本の構成がEmacsでありながらキーバインドVimに寄せているというもので、ジャンルとしてはEvilの一味のような感じなのかもしれません。




f:id:komi1230:20180921185800p:plain




基本のキーバインドとして、Vimで使っていたモード切り替えをスペースキーに配置して、モードの切り替えによってEmacsでありながらモードの切り替えによって多彩なショートカット機能に対応しています。




もちろんEmacsVimのハイブリッドということで操作性をEmacsに寄せることもできればVimに寄せることができます。




Emacsの誇らしい文化である全て内部で完結するという引きこもり文化がSpacemacsでは生きていて、内部でShellを叩くこともできるし、内部でPDFを表示させてLaTeXを執筆するということも可能です。




さて、そんな感じでSpacemacsという素晴らしいエディタと出会ったわけで、ぼくの当初の狙いであるSLIMEをエンジョイしたCommon Lispの開発環境が完成したわけですね。




SLIMEの導入についてはQiitaの解説記事に書いてある通りにレイヤーの記述、あとは~/.emacs.elに直接 (require 'slime) と書き込んだりすればなんとかなります。




ということで現在はSpacemacs+Common LispでPractical Common Lispを読み進めているのですが、Lispのマクロ機能に日々驚いています。




Spacemacsについて結構解説したので、ついでにPractical Common Lispという本についても少し言及を。




Lispの名前の由来はList Processorという感じでリスト処理に命をかけた言語なのですが、このPractical Common Lispという本は少し変わっていて、Lispのリスト処理の中心となる関数であるcarとかcdrは本の後半とかにならないと出てきません。




その代わりに、全部で40章近い構成の中で、第3章という早い段階でマクロの解説をしてデータベースの処理などを行なっていきます。




すでにSICPでリスト処理の関数を自作しまくってた身としてはマクロが学びたかったところなので、こういう本はめちゃくちゃありがたいです。




そんなこんなで現在はLispライフをエンジョイしています。



まとめ






結構長々と書きましたが、要するにVimmerとしてCommon Lispを触る際にCommon LispとSpacemacsの組み合わせが最高です。




また、Lispの学習ロードマップとしてSICP→Practical Common Lispという順でいくとかなり楽しいです。




たしかにSICPは読むの大変だけどコンピュータサイエンスの勉強ではなくLispを味わいたいというのであれば3章まで読めばいいと思います。




4章以降はインタプリタとかコンパイラの実装になるのですが、1章で数値計算アルゴリズム、2章ではリスト操作によるメタ的な操作(代数型演算子の実装は特に面白かった)、3章では並列化とか遅延評価の話になるので、1,2,3章をやっておけばLispの威力を知るのは十分でしょう。




皆さんもLispどうでしょう?