前回の記事で紹介した、弊社アリエル・ネットワーク主催の勉強会、ありえるえりあ勉強会で30分の発表をしました。
わざわざ平日の忙しい中来ていただいた方、またust中継を見ていただいた方ありがとうございました。
終わったあとCTOに「どうでした?」と聞いたら、「うん、まあちょっと声が小さいかなと思いましたけど、深町さんっぽかったと思います」と言われました。確かにust見ると声が聞き取りづらかったかなぁと自分で思いました。次のShibuya.lispではもうちょっと大きくします。
スライドは早速SlideShareにアップロードしてあるのでまだ見ていない方、復習したい人は以下をどうぞ。
Lisperの見る世界
View more presentations from fukamachi.
ustの録画はこちら。最初のほうが切れています。
発表資料はもちろんL5を使っています。本当は内容を文章におこしてブログ記事にしちゃう予定だったのですが、もうくたくただし、日を置くと忘れちゃいそうなのでそのままL5のコードを載せてしまいます。口頭で話した内容は間にコメントとして書いてあるので内容はだいたいわかると思います。
(defslides
[(t "Lisperの見る世界")
{:attr {:font-size 15
:padding {:top 30}}
:body ["アリエル・ネットワーク"
"深町英太郎"
"2010/10/29"]}]
[(title "自己紹介")
(item "深町英太郎です (@nitro_idiot)"
"Lisper (CL, Clojure)"
;; 趣味ではCommon Lisp
;; よく聞かれるので使っている処理系とか書いてみました
;; LicenseもってないのでAllegro CLは使っていません
;; 誰かLicenseください
"処理系はSBCL"
"Lisp歴1年ちょっと" ;; Lispを始めてからまだ1年くらいしか経っていません
"オープンソース愛好家"
"八発白中 "
"Shibuya.lisp, YAPC::Asia")
(with-padding {:top 150 :right 0 :bottom 0 :left 500}
(with {:position :fixed} (img "redhat.png")))]
;; で、
[(t "今回のテーマ: Lisp脳")]
[(t "そもそも" "自分もよくわからない")]
[(t "とりあえず")]
[(t "(eq 僕 'Lisper)")]
[(t "という意識はあるので")]
;; このタイトルは
[(t "Lisperの見る世界")
{:attr {:font-size 15
:padding {:top 30}}
:body ["アリエル・ネットワーク"
"深町英太郎"
"2010/10/29"]}]
[(t "僕の見る世界")
{:attr {:font-size 15
:padding {:top 30}}
:body ["アリエル・ネットワーク"
"深町英太郎"
"2010/10/29"]}]
[(t "としても" "構わないでしょ")]
;; ということで、
;; 僕がどのようにLispに手を染めていったかなどを語りたいと思います
[(section "第一章" "なぜLispなのか")]
[(title "言語選びの基準")
(item "そもそも言語に何を求めるのか?"
"言語には2種類ある"
"短期的か長期的か")] ;; という違いがあるんじゃないか
;; 短期的・長期的というのはどういうことかというと、
[(title "短期的な言語、長期的な言語")
(with {:font-size 25}
(lines "短期的な言語"
" = 直近で何らかのメリットが見込める言語"
;" => Webアプリが作れるとか"
;" => 便利なフレームワークがあるとか"
;" => 仕事で使えるとか"
" "
"長期的な言語"
" = 人生で長く使うことを考えた言語"))]
[(title "短期的な言語、長期的な言語")
(with {:font-size 25}
(lines "短期的な言語"
" = 直近で何らかのメリットが見込める言語"
" "
"長期的な言語"
" = 人生で長く使うことを考えた言語"
" => 楽しく書けることが重要"))]
;; もちろんこれは相反する選択肢じゃないので
;; どちらにも属するということも考えられます
;; ただ、どちらか一方を選ぶとしたら
;; どちらが好きですか?
[(title "Which prefer?") (t "(or 短期 長期)")]
;; 僕の場合、
[(title "道は長い")
(lines "・僕は比較的若いプログラマ" ;; 35歳定年説 (あと12年)
"・まだ自分の技術をfixする必要がない"
"・我慢してまで使う言語はいらない"
"・一生付き合う言語を探すのもいいでしょう"
" => 長期的に求める言語とは?")]
[(title "長期的な言語")
(lines "・何より楽しく書けることが重要"
"・ストレスがない" ;; これには人によって二つの意味がある
" => 安全?自由?")]
;; どちらが好きですか?
[(title "Which prefer?") (t "(or 安全 自由)")]
[(title "安全な言語、自由な言語")
(lines "・言語の思想によって違う"
"・安全な言語"
" "
" "
"・自由な言語"
" ")]
;; これらの違いは、静的型づけか動的型づけかとか
;; あげればいくつかあると思いますが
;; ものすごく簡単に違いを言うと
[(title "安全な言語、自由な言語")
(lines "・言語の思想によって違う"
"・安全な言語"
" => プログラマを信用しない"
" "
"・自由な言語"
" => プログラマを信用する")]
;; この選択肢は相反するものだと思います
;; どちらが好きかはほんとに考え方の違いになってしまうのですが、
;; ここでちょっと引用を。
;; たぶんPaulという人を聞いたことがある人は多いと思いますが
;; その人が言語設計の際に語ったことです
[(title "(every #'hackerp programmers)")
(with {:font-size 20}
(lines "いくつかの点で、ユーザがよいプログラマと仮定できれば問題が"
"より簡単になる。"
"言語設計者は、あれやこれやをすることを許されているユーザが、"
"混乱してやらかすことについてたびたび心配するのに気づくだろう。"
"いったんユーザがよいプログラマだと仮定すれば、すべてのそう"
"いった疑問に対する回答を自動的に得ることができる:"))
{:attr {:font-size 25}
:body "ユーザが望むことは何でもやらせよう。"}
{:attr {:font-size 20 :padding {:left 500}}
:body "-- Paul Graham"}]
;; 僕も同じ意見です
;; 「安全な言語」を使ったからってバグがなくなるわけでもないし
;; むしろバグを見つけてからさくっと修正できるような「自由な言語」
;; のほうが開発が活発になってバグも減らせるんじゃないかと思う
;; まあ僕が優秀かどうかはともかく
[(title "(every #'hackerp programmers)")
(with {:font-size 25}
(lines "・僕が優秀かはともかく、"
"・コンピュータにあれこれ言われるのは腹立たしい"
" => 何より自由な言語を選ぶ"))]
;; また、言語を選ぶ上でもう一つ重要な問題があります
[(t "もう一つ")]
[(title "Which prefer?") (t "(or 画一性 多様性)")]
[(title "書き方の多様性")
(item "文脈によって書き方は変わる"
;; 技術書を書くときと小説を書くときの日本語は違うのと同じように
;; ループ1つでも様々な書き方ができるべき
"forがあればmapはいらないのか?"
;; 意見がわかれると思いますが...
"unless大好き"
"There are too many ways to to do it.")
{:attr {:padding {:left 420 :top -5}}
:body "-- Larry Wall"}]
[(title "書き方の多様性")
(lines "・いろんな種類のプログラムがある"
" => それに合わせて柔軟に書けるべき")]
;; これを突き詰めると、その最たるものが、
[(t "Lispマクロ")]
;; ただ最近のLLにありがちなのはメタプログラミング
[(t "マクロなんて" "いつ必要になるのか?")]
[(t "メタプログラミング" "じゃダメなのか?")]
[(title "LLのメタプログラミング")
(item "例: Perl5のMoose"
"無駄にパフォーマンスを下げる"
"構文が言語に引きずられる" ;; なんか無理やり構文を合わせている気がする
;; だからメタプログラミングは難しい
"本当に必要なのはdefmacro")]
[(title "LLのメタプログラミング")
(item "例: Perl5のMoose"
"無駄にパフォーマンスを下げる"
"構文が言語に引きずられる"
"本当に必要なのはdefmacro")
{:attr {:text-align :center
:padding {:top -10}}
:body ["一見同じことをしているように見えるが、" "Lispはより上手に抽象化できる"]}]
;; まとめると、
[(title "まとめ")
(with {:font-size 23}
(item "短期的? 長期的?"
"安全? 自由?"
"画一性? 多様性?"
"僕は「メタプログラミングがわからない可哀想な子」"
"defmacroがある言語しか使わないよ"))]
[(section "第二章" "Scheme, Clojure, CL")]
;; まあそうは言っても、マクロが使えればなんでもいいってわけではないです。
;; マクロが使える言語にはこんなLisp方言があります
[(title "defmacroのある言語")
(item "Scheme"
"Clojure"
"Common Lisp")
{:attr {:padding {:top 120}}
:body ["・Arc" "・Emacs Lisp"]}]
;; アリエルにはEmacs Lisperも多くいるし、
;; Emacs Lispも一応defmacroがあるのでいれたんですが
;; まあ、ここでは除外しておきます
;; あとArcはよく知らないです
[(title "defmacroのある言語")
(item "Scheme"
"Clojure"
"Common Lisp")]
[(t "順番に評価してみる")]
;; まずはScheme
[(t "Scheme")]
[(title "Schemeの嫌いなところ")
(item "#" ;; 返り値が未定義って何よ
"空リストが真"
;; 返り値がundefだったり#fだったりするので、
;; 気持よく関数型的プログラムができない
;; 空リストのcarがエラーになったり
;; 再帰でnull?しないといけない
"nilがない"
"loopがない"
"リードマクロがない")]
[(t "Scheme")]
[(t "Scheme") (t "×")]
;; 次はここ数年流行りのClojure
[(t "Clojure")]
[(title "Clojureの嫌いなところ")
(item "Clojureが嫌いというかJavaが嫌い"
"Javaコードが混ざるとカオス" ;; 副作用
"リードマクロが非サポート")]
[(t "Clojure")]
[(t "Clojure") (t "×")]
;; 最後はCommon Lisp
[(t "Common Lisp")]
[(title "Common Lispの嫌いなところ")
;; Common Lispの場合は他の方言と違って名前とかの不満が多いです
(item "lambdaが長い"
"というかいろいろ長い" ;; multiple-value-bind destructuring-bind
"let, cond, mvbind, dbindがカッコ多すぎ"
"平気で副作用使ってくる")] ;; mapcanとか
;; とかいろいろ不満点があって
;; Common Lispもダメかぁ...
;; ClojureやArcを見てると我慢してそっちのほう使ってたほうがいいかなぁ...
;; と思っていたんですが、
;; 幸いなことにCLにはリードマクロがあるので、
;; リード時にコードを書き換えるとかハックを使えば
;; これらは解決できます
[(title "Common Lispの嫌いなところ") ;; こんな感じ
(lines "・lambdaが長い => fn"
"・というかいろいろ長い => マクロ"
"・let, cond, mvbind, dbindがカッコ多すぎ"
" => 新しいパッケージ作って上書き"
" => let*に分配機能つけてみたり"
"・平気で副作用使ってくる"
" => 自分で純粋なものを定義")]
[(t "これらを盛り込んだものが")]
[(t "Un-Common Lisp")]
[(title "Un-Common Lispとは")
(item "僕が作ったCL上方言"
;; .sbclrcが巨大になってきたので
;; パッケージでも作るかと思って
;; どんどん追加していったら
;; Lisp方言になっていた感じ
"命名規則を統一"
"多言語から有用なアイデアを導入"
"CLの力はそのままに"
"「よりモダンなCLを」")]
;; たとえば
[(title "無名関数")
(item "(lambda (x) (* x 2))"
"(fn (x) (* x 2))"
"SBCLのevalを上書きしてフック")]
;; 実装はこんな感じになってます
[(title "無名関数")
;; 他にifとかcondをアナフォリックにしてたり
;; letのカッコを少なくしたり
;; let*に分配機能がついてたりします
(with-padding {:top -20 :left 30} (img "uncl-eval-override.png"))]
[(title "無名関数")
(item "(lambda (x) (* x 2))"
"(fn (x) (* x 2))"
"SBCLのevalを上書きしてフック"
"[* _ 2]")]
[(t "中置演算子も")]
[(title "1..n")
(item "'(1..10) => '(1 2 3 4 5 6 7 8 9 10)" ;; さっきはevalでしたが今度はreadを上書きしています
"#(1 1..5) => #(1 1 2 3 4 5)"
"(mapcar [* _ 2] '(1..10))"
"詳細は\"超リードマクロ\"で検索")]
;; まあCLerならloop使えよって話ですが
[(title "1..n")
(item "'(1..10) => '(1 2 3 4 5 6 7 8 9 10)"
"#(1 1..5) => #(1 1 2 3 4 5)"
"(mapcar [* _ 2] '(1..10))"
"詳細は\"超リードマクロ\"で検索"
"(loop for i from 1 to 10 collect i)")]
;; もっと気になる人は
[(t "Un-Common Lisp" "http://github.com/fukamachi/uncl")]
[(title "Un-Common Lisp")
(with-padding {:top -20 :left 30} (img "uncl-github.png"))]
;; GithubにあがっているのでREADMEとか見てみてください
;; ってな感じで
[(t "(Un-)Common Lisp")]
;; CLも良くはないんですけど、
;; 改善できるので許容できます
[(t "(Un-)Common Lisp") (t "△")] ;; 三角くらいな感じで
[(title "まとめ")
(item "CLはダメだ。"
"でも他の言語はもっとダメだ。")]
[(section "第三章" "CLが抱える課題")]
;; この章は自戒のために書きました
;; どうやら僕にぴったりな言語はCLだということになりそうなんですが、
;; だからCLが最強だから常に使うべきか、
;; っていうとそうでもない
[(title "CLは最強?")
(item "言語としてCLは素晴らしいけど、"
"短期的な言語としては貧弱"
"ライブラリが少ない"
"仕事がない"
"僕がCLとPerlを使い分ける理由")]
[(title "なぜCLで仕事ができないのか")
(item "導入例が少ない"
"ライブラリが少ない"
"並列処理の仕様がない"
"exeどうやって吐くの?")]
;; まあこの辺はAllegro CL使っている人には無縁なのかもしれないですが
;; 「Allegro CL使えばいいじゃん」という人がいたら
;; 僕にLicenseください
[(title "なぜCLで仕事ができないのか")
(item "導入例が少ない"
"ライブラリが少ない"
"並列処理の仕様がない"
"exeどうやって吐くの?")
{:attr {:font-size 37 :text-align :center :padding {:top -20}}
:body ["これらをもっと" "深刻に考えるべき"]}]
[(title "なぜCLで仕事ができないのか")
(with {:font-size 23}
(lines "・他の言語でできないことがCLにはできる"
"・でも、他の言語で当たり前にできることができない"
" => 導入できるはずがない"))]
[(t "例えば" "ライブラリ")]
[(title "ライブラリの貧弱さ")
(lines "・「CLはライブラリが少ない」"
"・「あるよ」"
" => 試すと日本語非対応"
" => SBCL限定"
" => スレッド有効にしてね")]
;; とか言われたりして
[(title "ライブラリの貧弱さ")
(lines "・「CLはライブラリが少ない」"
"・「あるよ」"
" => 試すと日本語非対応"
" => SBCL限定"
" => スレッド有効にしてね")
{:attr {:font-size 37 :text-align :center}
:body ["ふざけんじゃねー"]}]
;; ってなる
[(t "ただ")]
[(t "環境は" "変えられる")]
[(t "もっと" "CLをよくしよう")]
;; Rubyにdefmacroを導入されるより
;; CLの実用性が増すほうが可能性のほうがありますよね
;; そのために我々が共有すべきこと
[(title "我々が共有すべき意識")
(item "言語の優秀さに胡座をかくのはやめよう"
"もっとLLに学ぼう" ;; 今、RubyとかPerlが流行っているのは何か理由があると思うんです
;; 皆はLLを望んでいる
;; Lispは他の言語に比べてLLから学んでいることが少ないのでは
;; 具体的に何をマネしろって話でもないのですが
"ライブラリを豊富にしよう" ;; Perlは「CPANがある」ってだけの理由で使う人もいるほど
;; 「Lispはライブラリが少ない」って言われるのは癪なので
;; もっとライブラリを増やしたほうがいい
;; CL-TEST-MOREとか作ってみた
;; Quicklispがライブラリ用のリポジトリを公開して
;; CPANみたいなのを構築してくれるといいのになぁ
"日本語ドキュメントを増やそう"
"入門記事よりも実践的な記事のほうが重要" ;; Shibuya.lispでもScheme入門とかClojure入門とか、
;; SLIME環境構築の話だったりが多いけど、
;; そういうのばっかりなのはだめだと思う
;; 「俺はLispを使ってこんなクールなことをしてるぜ
;; って話を聞くほうが使ってみようかなって気分になる
;; 最近、「あ、このソフトウェア面白いな」と思ったら
;; RubyやPythonで書かれていることが多い
;; こういうのでもっとLispが出てくればいいなぁと思う
"流行に乗ってみよう")] ;; クラウドとか
;; NoSQLのドライバとか (あるけど日本語非対応とかやめてほしい)
;; ちゃんとしたアプリケーションじゃなくても、
;; ブログで話題になってるネタをLispで書いてみたりとかでもいいと思う
;; まあこういうのを徐々に改善して
;; CLでお金が稼げるようになればいいなぁと思っています
[(t "CLで" "仕事ができれば" "いいですね")]
;; Javaなんて書きたくない
;; 以上です
[(t "ご清聴ありがとうございました")]
)




コメントする