ILC2012個人的まとめ#3 三日目

この日も朝5時起床、6時出発。帰りはエキサイティングしているのでいいが、行きは疲労が抜けずきつい。

Lisp : a language of freedom

竹内先生の昔話。やっぱりどれも面白い。

  • 1960年代
    • LIPQ(1972)
      • 和田先生の話にもあったTAOの car, cbr, ccr, cdr はこれ由来らしい
    • TAO(1978-1998)
      • TAOは3バージョンあったそう。2nd TAOはPrologとSmalltaklを含んでいる。3rd TAOは論理プログラミング(ambのすごいもの?)を含んでいる
  • 3rd TAO
    • 関数と述語(論理プログラミングでの関数のようなもの?)の名前空間は別
      • 述語の構文には通常の括弧ではなく [ ] を使う
    • オブジェクト間で、メッセージ渡しができる(Message-Passing-Styleのプログラミングができる)
    • メッセージ通信の構文には通常の括弧ではなく { } を使う
  • 「TAOはNILを生み、NILATOMを生み、…」の話
  • 数学クイズ。回答の2と3は隠したままにされてしまった
  • Palindrome Program (回文プログラム)
    • 「しんぶんし」のように逆から読んでも内容が同じプログラムコード
  • Takeuchi Function (竹内関数)
    • ベンチマークで有名なtarai関数
    • 計算量は O(N^N) だそう
    • False Takeuchi Function (偽竹内関数、tak関数)
      • マッカーシーが間違って一箇所のyをzにしてしまった版の竹内関数。元の竹内関数と比べて計算量が大きく減っている
  • tarai関数の停止性証明について
  • tarai musicの実演
    • tarai関数の計算過程を音程化して音楽のようにしたもの。ぐぐったらもっといい解説があるだろうので省略
  • カレンダー
    • 地球以外の星のカレンダーを作ってみよう、という話
      • いろんな星にも対応できるように、「カレンダー表示プログラムを生成するプログラム」をつくる、という話

Ralph - A Dylan dialect that compiles to JavaScript

ITUコペンハーゲンの人の発表。
Ralphという、S式を捨てたLispであるところのDylanの構文を、またS式に戻した言語の紹介です。やっぱみんなS式は捨てられないんだ。
結構気になったので(Dylan気になってたけどS式じゃないというので遠慮した口なので)、あとでgithubみにいったけど、ドキュメントが全然なくて(後日紹介されたHOPの方はドキュメントすごい!)、そこでちょっと使ってみる気がなくなってしまった。やっぱ参入障壁を下げる為にドキュメント完備は重要かもしれない。

  • 動機
  • 既存の、JavaScriptコンパイル可能なLisp処理系
  • 上記について、機能、実装の複雑さ、コンパイル戦略等をチェックした結果の問題点
    • パフォーマンス
      • 最適化が必要
      • 不要なclosure
        • 例えば、ClojureScriptでletか何かを書いてJavaScript化したら、「(function ...)()」みたいに変換されてしまい、速度にちょっとペナルティがある的な話
    • 相互運用性(LispJavaScriptの。おそらく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に近いと思った
  • モナド
    • トポロジー的に?同じブロックがあった時に、そこを共有したい。この時に、普通に関数に切り出せる時もあるが、カリー化した高階関数を渡す形にしないと切り出せないものもある(逆に言えばそうすれば切り出せる)。この抽象化を行った後のデータフローの形のセマンティクスがHaskell等のモナドと同じ、という事らしい(多分)

Xcrypt in Lisp : A Scripting System for Job Level Parallel Programming in Lisp

Xcryptの為のCommonLispフロントエンドを作ったよ便利、という話。

  • Xcryptとは、スパコンで並列処理を行う指令を処理するシステム。RPCで通信を行い、perlで実装されている
  • Xcrypt自体の解説
    • ジョブレベルパラレルスクリプト言語
    • 二層並列化を行っている?
    • 海水温度シミュレーションでつかってみた
    • ゴールはPDCAサイクルの自動化
    • ジョブスクリプトのサンプル(perl)
    • Xcryptのコードはperlperlライブラリとランタイムで書く
    • 拡張モジュール各種がある
  • Lispフロントエンド
    • LispからRPCを叩く(RPCの先はperl)
    • コールバックも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」(引数が上と逆転してるし返り値も違う)
    • 二分木の場合は毎回自分で書く…
  • (上のに比べて)よい単相性(のコード例)
    • 「(_alist-lookup map key) => value foundp」
    • 「(_hash-table-lookup map key) => value foundp」
    • 「(_binary-tree-lookup map key) => 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の方の例は、最終的にはalistならば「(lookup map key) => value foundp」というコードになった
    • このコードのは「 = ( )」の省略形であるらしい
    • つまり、上記のlookupのコードは「(lookup ( ) map key) => value foundp」という事になるっぽい。また、ここのの他にもとかとかとか、色々と指定可能という事らしい
    • このとかが「パラメトリック」なインターフェース、という事らしい(多分)
  • 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絡みの言語の名前が際限なく飛び出してくるアニメーション。出てくるのが止まる前に「きりがない、先に進めよう」
  • 歴史
    1. HTMLのみ
    2. CSS (本文とスタイルが分離)
    3. MVCフレームワーク (サーバサイドのみ)
    4. JavaScript (DOM、プログラマブルクライアント)
    5. XMLHttpRequest コンピュータブルリクエスト
    6. クライアントサイドもMVCに
      • 計算をクライアント側でやるかサーバ側でやるかを選べる。
      • multi-tiers languages (多段言語?)
    7. 今: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は信頼できない!」
      • (通信経路障害等により)リクエストに対するレスポンスが返らない/おかしい可能性を排除できない。これらもそれなりにいい感じにエラーハンドリングするよ、という話だった気がする(すごいうろおぼえ)

Banquet

みんなで晩御飯。
しかし人数が多くて店の椅子が足りない為、乾杯してちょっとしてから、日本人若手組(?)の椅子のない人九人ぐらいで別の店へ。
もつ鍋とか食べながら色々と話をする。
面白い話を色々聞いたけど、既に二日目の飲み会にした話とごっちゃになってしまっている。時系列がおかしい。
http://lispjobs.wordpress.com/ の話をしてもらったのはこの晩御飯行く途中だったと思うんだけど…。自分も海外行きたい。