ILC2012個人的まとめ#3 三日目
この日も朝5時起床、6時出発。帰りはエキサイティングしているのでいいが、行きは疲労が抜けずきつい。
Lisp : a language of freedom
竹内先生の昔話。やっぱりどれも面白い。
- 1960年代
- 3rd TAO
- 関数と述語(論理プログラミングでの関数のようなもの?)の名前空間は別
- 述語の構文には通常の括弧ではなく [ ] を使う
- オブジェクト間で、メッセージ渡しができる(Message-Passing-Styleのプログラミングができる)
- メッセージ通信の構文には通常の括弧ではなく { } を使う
- 関数と述語(論理プログラミングでの関数のようなもの?)の名前空間は別
- 「TAOはNILを生み、NILはATOMを生み、…」の話
- これ有名だからネットのどこかにあると思ってぐぐったけどこれしか見付からなかった。 https://twitter.com/dio_summer/status/9920010150 微妙に語が違うのか、他検索結果にまぎれてしまったか。とりあえず「初めての人のためのLisp」にはあった筈だが
- 追記: https://twitter.com/g000001/statuses/261769070960062465 だそうです。ありがとうございます。英文だった。
- これ有名だからネットのどこかにあると思ってぐぐったけどこれしか見付からなかった。 https://twitter.com/dio_summer/status/9920010150 微妙に語が違うのか、他検索結果にまぎれてしまったか。とりあえず「初めての人のためのLisp」にはあった筈だが
- 数学クイズ。回答の2と3は隠したままにされてしまった
- Palindrome Program (回文プログラム)
- 「しんぶんし」のように逆から読んでも内容が同じプログラムコード
- Takeuchi Function (竹内関数)
- tarai関数の停止性証明について
- tarai musicの実演
- tarai関数の計算過程を音程化して音楽のようにしたもの。ぐぐったらもっといい解説があるだろうので省略
- カレンダー
- 地球以外の星のカレンダーを作ってみよう、という話
- いろんな星にも対応できるように、「カレンダー表示プログラムを生成するプログラム」をつくる、という話
- 地球以外の星のカレンダーを作ってみよう、という話
Ralph - A Dylan dialect that compiles to JavaScript
ITUコペンハーゲンの人の発表。
Ralphという、S式を捨てたLispであるところのDylanの構文を、またS式に戻した言語の紹介です。やっぱみんなS式は捨てられないんだ。
結構気になったので(Dylan気になってたけどS式じゃないというので遠慮した口なので)、あとでgithubみにいったけど、ドキュメントが全然なくて(後日紹介されたHOPの方はドキュメントすごい!)、そこでちょっと使ってみる気がなくなってしまった。やっぱ参入障壁を下げる為にドキュメント完備は重要かもしれない。
- 動機
- アプリ開発
- Web技術
- JavaScriptオンリー、しかしJavaScriptでは大規模アプリ開発に向かない(おそらくLispと比べて)
- 既存の、JavaScriptにコンパイル可能なLisp処理系
- 上記について、機能、実装の複雑さ、コンパイル戦略等をチェックした結果の問題点
- パフォーマンス
- 最適化が必要
- 不要なclosure
- 例えば、ClojureScriptでletか何かを書いてJavaScript化したら、「(function ...)()」みたいに変換されてしまい、速度にちょっとペナルティがある的な話
- 相互運用性(LispとJavaScriptの。おそらくeval回り)
- パフォーマンス
- Ralph
- 目指すのは、パフォーマンスと機能と表現力
- Dylanに色々とインスパイアされている(ここでDylanの簡単な説明あったけど省略)
- S式構文
- Dylanのスペシャルフォームと標準関数群が提供される
- モジュールシステム
- オブジェクトシステム
- マクロシステム
- プロシージャルで健全(伝統的なマクロと違い、マクロ内と外で変数名が偶然衝突しても平気)
- Clojure風
- quasiquote使用
- syntax-quoting (よく分からない)
- スコープ
- statementフォーム
- 最適化
- サイズを越えたパフォーマンス(???)
- インライン化
- 末尾再帰最適化
- (JavaScriptの)プロパティへのアクセス減らし
- 将来やりたい事
- https://github.com/turbolent/ralph
- 質問で、googleとかのJavaScriptオプティマイザは?みたいな話が出てたけど聞き取れなかった
Plumber : A Higher-Order Data Flow Visual Programming Language in Lisp
おおお、これだよこれ!自分がHasp使って実装したかった奴は!って思った。すごい良い。
(ちなみになんでHaspなのかというと、ブロックとブロックを線でつなぐ時に型が一致してなかったらつなげない、みたいなのがいいなと思ったからです)
要は、中身がLispの、見た目がYahoo!Pipesっぽい奴です。
公開とかはしてないのかな…。
未来のプログラミング環境は絶対これ系になると思う(VRとかで3Dなのを手でつかんだりとか進化して)。
このプレゼンの元は2010年に日本語で行われたようで、その日本語版の古い方はここにあった( http://jp.franz.com/base/seminar/2010-11-19/seminar10-dfvpl.pdf )。この文章読むよりこのpdf見た方がずっと有益!
- Plumberとは「配管工」の事だそう
- データフローモデル
- Data Flow Visual Programming Language、略してDFVPL
- フローチャート図はDFVPLではない、コントロールフローなので
- Prographという汎用言語もあるらしい、詳細はよく分からない http://ja.wikipedia.org/wiki/Prograph_CPX
- PlumberはAllegro CLで動く
- 実際にデモ。ぐりぐり動かせる
- 表面がGUIだけど、内部でS式になる
- 「Stream」と「UnStream」というブロック(関数)があり、Streamはリストをストリームに変換し、UnStreamはストリーム(複数指定可能)と数値を引数に取って数値の長さのリストを作成する。
- 高階関数をどう表現するか
- カリー化で!
- カリー化した関数はfuncallで実行する。またこれはカリー化となっているが、任意の位置の引数をカリー化できるので、Gaucheのcutに近いと思った
- カリー化で!
- モナド
Xcrypt in Lisp : A Scripting System for Job Level Parallel Programming in Lisp
Xcryptの為のCommonLispフロントエンドを作ったよ便利、という話。
- Xcryptとは、スパコンで並列処理を行う指令を処理するシステム。RPCで通信を行い、perlで実装されている
- Xcrypt自体の解説
- Lispフロントエンド
- 同じ事を行うperlコードとLispコードの比較
- map処理が普通にできる
- ジョブレベルで並行なmap関数の実装とか → jmapcar という名前の関数
- REPLからも普通に使える
- RPC回りの実装について
- ストリーム、パッケージ等は実装されてない
- ジョブオブジェクト等のオブジェクト類は、idだけ送って実体は送らないという実装との事
- 質問で「他のスパコンユーザに、『これとLispを使うとこんなにいいよ』とプロパガンダを行う事が必要なのでは?」というツッコミが
おひる
例によって会場でお弁当もらって食べる。
食べ終わった後は、疲労回復の為に昼寝とかしてた気がする
Revisiting CLOS MOP
話を聞く前は「CLOSのMOPの解説?もういいかな」と思ってたら実は全然そんな事はなくてすごい面白そうだった。が途中から完全についていけなくなった(難易度的な面で)。
LIL : Lisp Interface Library CLOS reaches higher-order, sheds identity and has a transformative experience
CLOSにインターフェースを追加してより使いやすくする話およびそこから更に進化する話。
見た目も綺麗だけど、見た目以上に応用範囲がありそう。大規模アプリ構築向け?
下のgithuvのリンクから辿れるけど、内部はすごい濃密で、自分には表面的な部分しか追い切れなかった。あと解釈間違ってる可能性が高そう
プレゼン資料何度も読み直した。
- IPS (Interface-Passing Style、インターフェース渡しスタイル)
- 後述のコードのように、明示的にインターフェース指定を渡すスタイルの事っぽい
- 有限マップデータによる例示
- 有限マップ(コレクション的な何か?)を操作する例
- 「(lookup map key)」というコード(CLなのでmapは関数じゃなくコレクション的な何か)
- このmapがalistかhash-tableか二分木かによって正しくディスパッチしたい
- よくない単相性(のコード例)(上の話の続き)
- 「(assoc map key) => pair?」
- 「(gethash key map) => value foundp」(引数が上と逆転してるし返り値も違う)
- 二分木の場合は毎回自分で書く…
- (上のに比べて)よい単相性(のコード例)
- これらをいい感じに書く為の、関数型での手法とOOPでの手法の概略
- IPS
- これを、「(lookup
map key)」のように、引数を一つ増やしてインターフェースを指定するようにする - 上記の結果、alistにもhash-tableにも二分木にもいい感じに操作できているコードをそれぞれ例示
- 更に、lookupではなくinsertの例を出す
- 「(insert <i> map key value)」
- ここで問題発生。alistの場合は問題ないがhash-tableへのinsertは破壊的更新を行う!
- lookupの方は純粋(alist、二分木)でもステートフル(hash-table)でも同じ関数で処理できるけど、insertの方はそうはできない、という事
- ステートフルかそうでないかは「pure:<map>」「stateful:<map>」のような記述で区別されるらしい
- これを、「(lookup
- パラメトリックなインターフェース
- さっきのlookupの方の例は、最終的にはalistならば「(lookup
map key) => value foundp」というコードになった - このコードの
は「 = ( )」の省略形であるらしい - つまり、上記のlookupのコードは「(lookup (
) map key) => value foundp」という事になるっぽい。また、ここの の他にも とか とか とか、色々と指定可能という事らしい - この
とかが「パラメトリック」なインターフェース、という事らしい(多分)
- さっきのlookupの方の例は、最終的にはalistならば「(lookup
- Passing Interface Arround
- 上記のようなmethodを定義する為の「defmethod」マクロのコード例など。そこそこ複雑
- インターフェース定義
- 「define-interface」マクロで抽象インターフェースを定義するコード例など
- マルチプルディスパッチ
- マルチプルディスパッチできるようなdefmethodの書き方のコード例。これは別に難しいところはなかった
- 具体的なパラメトリックなインターフェース(例)
- define-interfaceで抽象でないインターフェースを定義するコード例
- mixinのリスト(上の抽象インターフェース等のリスト)が結構多くて圧倒される。メンテ大変そう…
- マルチプル名前空間
- 名前空間がクラス、関数、変数、で別々なので混乱しないように!との事
- 変換
- with-interfaceマクロによって、指定ブロック内では、明示的なインターフェース指定を省略できる???
- IPSから関数型プログラミングへ
- ピュア化したhash-tableをまたステートフルなhash-tableに戻したり、という事ができるらしかった…けどよくわからなかった
- IPSからOOPへ
- これもちょっと分からなかったです、すいません
- https://github.com/fare/lisp-interface-library
- 「(quicklisp:quickload :lil)」
Managing Complex Structured Data In a Fast Evolving Environment
上のタイトルは冊子見て確認したけど、実際の発表の時は違うタイトルだったような…。
LS1100という製品のソフト部をほぼLispで実装したよ、という話。
なんか面白そうなハードだった。でも指紋管理の為のものという事で個人でどうこうするものではないようだ…。
自分に英語力があったらどれぐらいの価格帯の商品なのかちょっと聞いてみたかったけど英語力などなかったので質問せず。
LS1100の紹介ページはここ http://www.secureoutcomes.net/LiveScan_Products.html
個人データの管理という事で、後日の論文名寄せシステムと似た感じの処理をしていたりという点もちょっと面白かった。
- LS1100
- キーボードもマウスもなし、タッチスクリーンでの操作
- プリンタと指紋スキャナがついている
- ソフト部は99%がCLで書かれた?
- 10万行のCLコード、2000行のCコード
- 問題点
- I/O : 指紋スキャナ、指紋カード、データ転送、データ入力、等々、多種多様
- フォーマット : 名前の姓と名の順、ミドルネーム、間にカンマが入ってるか、等々、これも多種多様
- 前述の問題点を解決するのが「widgets」
- 各プロパティに対するgetterとsetterがある
- 各エントリ/データ(ソース)に対するformatterとparserがある
- validatorがある。これは前述のparserにかける前に通すもので、DSLとの事
- 「defvalidator」という名前のマクロになっていて、chainingが可能との事
- widgetの定義は「defwidget」マクロで
- duplication
- 同じ人を別の複数のエントリとして登録しておきたい、という、顧客からの要望がたまにあるらしく、それに対応する為の処理らしい
- using Lisp
- DSL
- 他にもいいところいろいろ(メモ取るの追いつかなかった)
- 素早い開発 + スタートアップの為のエクストリームなパワー
- ちなみにこの製品のコードの全部のマクロ展開をカウントしたら、100万回ぐらい展開していたそう…
- http://www.symbo1ics.com/ 小文字のLじゃなく、数字の1です、という説明。発表されたRobert Smithさんの個人サイト。
- http://www.secureoutcomes.net/ この製品の会社のサイトっぽい
Along Hop
HOPというプログラミング言語の紹介。
プレゼンも面白かった。
- 言語名および今回のプレゼンのタイトルの由来は「Hopalong Cassidy」らしく、スライドにちょっと映る → http://en.wikipedia.org/wiki/Hopalong_Cassidy
- 個人的には「HOPALONG CARROT」の方を連想してしまう
- バベルの塔の絵(「ハッカーと画家」の表紙の絵)から、WWW絡みの言語の名前が際限なく飛び出してくるアニメーション。出てくるのが止まる前に「きりがない、先に進めよう」
- 歴史
- HTMLのみ
- CSS (本文とスタイルが分離)
- MVCフレームワーク (サーバサイドのみ)
- JavaScript (DOM、プログラマブルクライアント)
- XMLHttpRequest コンピュータブルリクエスト
- クライアントサイドもMVCに
- 計算をクライアント側でやるかサーバ側でやるかを選べる。
- multi-tiers languages (多段言語?)
- 今:HOPがやってきた
- http://hop.inria.fr/
- 関数型言語
- Web用言語
- 構文はS式
- 「with-hop」「service」というスペシャルフォームがある。これによってクライアントサイドで計算するかサーバサイドで計算するかを指示できる。
- しかしそれだけではなく、「~」「$」前置記号がある。これはquasiquoteとunquote(つまり「`」と「,」)と似たように、この記号の次のS式だけクライアントサイドもしくはサーバサイドで計算させられる。
- モジュール読み込みも「(import ...)」と「~(import ...)」で、クライアントサイドにインポートされるかサーバサイドにインポートされるかの違いがある、との事
- Hop Ajax, Hop Comet, 生のGUIイベント、等々がいじれる
- デモ
- コードサンプルもあり。
- 基本はS式でhtmlを書いていく(任意の場所でLispの関数が書ける様子)
- 「(<html> (<body> :bgcolor white (<div> ...)))」みたいな感じのコード
- コードサンプルもあり。
- Weblets : HOPによるJavaアプレットみたいな奴を「Weblet」と呼ぶよう
- 公式サイトにサンプル付きリファレンス完備との事
- security
- コードインジェクション耐性
- オーケストレイション(組織化?)
- 「Webは信頼できない!」
- (通信経路障害等により)リクエストに対するレスポンスが返らない/おかしい可能性を排除できない。これらもそれなりにいい感じにエラーハンドリングするよ、という話だった気がする(すごいうろおぼえ)
- 「Webは信頼できない!」
Banquet
みんなで晩御飯。
しかし人数が多くて店の椅子が足りない為、乾杯してちょっとしてから、日本人若手組(?)の椅子のない人九人ぐらいで別の店へ。
もつ鍋とか食べながら色々と話をする。
面白い話を色々聞いたけど、既に二日目の飲み会にした話とごっちゃになってしまっている。時系列がおかしい。
http://lispjobs.wordpress.com/ の話をしてもらったのはこの晩御飯行く途中だったと思うんだけど…。自分も海外行きたい。