2008-03-09
■ [biwascheme][event] gauche.gongでLTしました
やっぱりSchemeのイベントでデモすると反応が大きくていいなあ,という.
右上の★ボタンを押すとREPLが開いたりするよ.(このためにevalとwrite-to-stringとhtml-escapeを実装するなどした)
このプレゼンツール自体もBiwaSchemeで書かれています.(ソース)
BiwaSchemeのダウンロードはこちらからどうぞ.
■ [event][scheme] 第2回gauche.nightログ おまけつき
注意
- 誤字は仕様です
- 全く見直ししていないため,内容には0個以上の誤りが含まれています.取り扱い注意
- 「fullでないcontinuation」ってどういうものなのか誰か教えてください
「プログラミングGauche」ができるまで
(ログ取れず)
自己紹介
- 「リリカルLisp」zickさん
- あと地獄Schemeとか,Prologのやつとか
- Gaucheはちょこっと触ったことがある程度
- Gaucheに期待すること:「どきどきわくわくできる謎の要素があれば楽しいかな,と」
- Gauche作者,shiroさん
- 「Gaucheの作者の河合です」(拍手)
- 昨日まで,仙台で「マイナー言語で食べていく方法」という講演をしてきた
- が,PPLではSchemeはマイナー言語じゃなかった(笑)
- 一生懸命Lisp/Schemeを流行らせましょう
- 今後Gaucheに追加したいこと:まだ1.0でないので(?)入れたいものはさくさく追加していきたい
- 「Mona OS」higeponさん
- Mona OSのシェルをSchemeで書こうと
- R6RS準拠のSchemeインタプリタをGauche上で書いたり
- Gauche/shiroさんに期待すること:若手のハッカーはshiroさんに憧れをイダイテ居るので,ずっと目標として突っ走ってほしい
- 今後やりたいこと:自分のOSのドライバをSchemeで欠けるようにしたい
- 「YARV(Ruby1.9)」ささださん
- 「ここでは多分マイナーな言語だと思うんですけど」
- Rucheme (Rubyで書かれたScheme)作者
- shiroさんと一緒に仕事を(聞きそびれた)
- <shiro> YARVとGauche VMは実はライバル.おたがい切磋琢磨していきましょう
- Gaucheに期待すること:2冊目の本はぜひ「Gauche ソースコード完全解説」で!(Gauche Hacking Guide?)
- <higepon> Gaucheのソース読みをしているが,随所にすごいところが.
- <shiro> Gauche書く前にずいぶんいろいろな処理系のソースを読んだ.食物連鎖で魚に水銀が溜まるように(!?),濃縮されたところを利用してほしい
- Common Lisper, 黒田さん
- Schemeとのかかわり:だいぶ古い時代から.今はCommon Lisp
- shiroさんとのかかわり:初めて会ったのはILC2002?海外でしか会わない日本人の一人w
- R6RSはあまり興味は無かったんだけど,今回のことがあるので目を通してきた.あとでいくつか質問(?)したい
Arcを斬る
- Paul Grahamが最近公開した言語
- <えんどう> SchemeでもCLでもない,第3の選択肢
- <shiro> まだ何か言うのは早いかなぁ
- Paulがやりたいのは,いろんなアプリを作る際にコアとなる公理を探すこと
- (Lispとしては,7つのプリミティブがあれば十分だが,それだけではアプリを書くには十分でない)
- Y Combinator のサイトはだいたいArcでできてるんじゃないかな
- Arcの挑戦 → Kahuaの反撃
- <えんどう> 短さ(簡潔さ?)ではKahuaもいい線いってると思うんですが,どうでしょう
- <shiro> Schemerは,将来首を絞めるような仕様追加を嫌う.Kahuaもそういう方針があって,Arcより多少長くなってると思う
- <higepon> ああいう形(コンパイラでもなく,マクロの集まり)で言語を公開してもいいんだな,と気付いた
- <shiro> それはLispとしては原点回帰みたいなものだね
- 実はPaulにも声をかけてみた
- Paulは3行異常のメールを読み飛ばすらしいw
- 2行で書いたら,「今回は行けない.私を考慮に入れてくれてありがとう」と1行の返信が帰って来た
R6RSを斬る
- <えんどう> サスマンもスティールもいないじゃん,と衝撃
- <shiro> chez schemeと plt schemeの人がいる.いろいろあって,次々とエディターが減った
- scheme界は頑固な人がおおい
- <黒田> R6RSを見たら,人が減るのもわかる
- algorithmic languageなのに,denotational semanticsを捨ててどうする
- operational semanticsにしたりせず,数学的にしっかりした土台を捨てるべきではないだろう
- 継続(call/cc)ってlongjmpを意味論的に綺麗に書くために生まれたものだよね,と理解している
- <shiro> 「君たちがそうするのは構わないが,Schemeと名乗ってくれるな」とMLにも…
- <黒田> R4RSあたりから歪んできてるよね
- <shiro> 結論としては,R5RSとR6RSという別の言語がある,ということに
- <黒田> 実用を目指すというなら,fullのcontinuation(??)を捨てるべき.unwind-protectも書けないじゃん
- call-with-input-fileで,「正常なときはstringが返るが,異常なときは未定義」
- <shiro> Gauche的には,full continuationはlow levelなシステム.そのまま使うのではなく,Gaucheの提供する例外システムなど上位レベルのものを使ってもらうという立場
- <黒田> unwind-protectとfull continuationなら前者を取るべきだと僕は思う.でもR6RSは後者を取っていて,どっちつかずだなぁというのがざっと見た感想です
- <shiro> それは正しい印象だと思う.これでも,最初の案より穏やかになっている(改善・妥協により)
- <shiro> マクロ展開のセマンティクス(どのタイミングでマクロが展開されるかなど)がきっちりしたのが良いところ
- ただそのせいでREPLはなくなった
- R6RSはSchemeの「最小仕様」で,処理系ごとの拡張は自由
- ポータブルなものを定義したかった
- <えんどう> 作る側としては,ライブラリの仕組みはめんどいですよね
- <higepon> 難しい
- <shiro> 難しくはない,効率を考え無ければ.複雑だしあまり美しくはないとは思う
- <higepon> 実際にR6RSのライブラリって出てきてる?
- <shiro> srfiのLazy Stringだとか
- R6RS以外では,ER5RS (R5RSの拡張)を作ってるグループがSNOWというライブラリシステムを提供している
- これからR6RSはsrfiがいろいろ出てくるのでは
- <黒田> ライブラリシステムでcondition systemを使ってるのに,それが本体に入ってないのは?
- <shiro> 一人でも反対したら入れられないので
- <黒田> コンディションの型システムさえもライブラリじゃん
- ライブラリがライブラリに依存している
- なんでライブラリに?
- <shiro> そのへんがR5RSの制限
- どちらも,Standard LibraryとしてR6RSの一部に入っている
- <higepon> レコード型のシステムがすごく多機能で複雑,これコンディションのために作られたのか?
- <shiro> その通りで,コンディションシステムのヒエラルキーのために入っていると思う.
- <ささだ> 最もプリミティブなものだけを仕様とするのがSchemeだと思ってたんだけど.
- <shiro> R6RSの批判側は,Schemeの精神を貫くならコンディションシステムも(Schemeで実装できるんだから)srfiでいいじゃんと言っている.私もその立場.
- <ささだ> これは投票で過半数?
- <shiro> 67%くらいが賛成したはず
- でもメジャーな処理系の実装者は軒並み反対したw
- 賛成はchez/PLT/48の一人だけ
- 最初からR6RSを対象にした処理系も,Ikarusとか出てきている
- <higepon> R5RSではバイナリ読み書きができない.R6RSではバイナリポートが定義されて嬉しいと思う
- <shiro> ポータブルなものを書きたい,という要求は大きかったはず
- <黒田> ポータブルは,大きいですよ
- もう少し成熟すれば,フリーな処理系,高い処理系,安い処理系といろいろ出てくるはず.フリーな処理系で何千万の開発はできないと思う
- Schemeで一番思うのは,ポータビリティーを全く考えてないだろということw
- 理学部ならいいが,工学部なら学士剥奪すべき(笑)
- <ささだ> Rのつく言語でも,互換性(ry
- <shiro> ポータブルという面では,CLだって仕様の範囲内では書けないものがあるのが不安.
- <黒田> 「CLも困ったもので,Scheme的な発想をする人たちがいて」
- 仕様の範囲外でも,de factoなものが結構ある.スレッドとか,各処理系でほとんど同じ
- 国際化文字の扱いも,extenal formatが決められている.とか.
- <shiro> de factoの話をすると,Schemeにもsrfiがあって….泥仕合になってしまうか.
- <黒田> Unicodeは,
- <shiro> まずR6RSコンパチのソースは,指定がなければUnicodeとして読む.
- 内部形式はどのようにしてもいい
- ファイルを読むときは,codecを指定できる.ポートで変換
- <ささだ> 「このソースはEUCです」みたいな指定はできる?
- <shiro> coding:... みたいな.Python由来(?)
- Schemeはreadとevalがあるので,実は「ソースのコーディング指定」という概念は間違っている(データとコードの区別がないから).データとしてどう読むかという指定だけが存在する
- <higepon> ライブラリの(理解できず)
- <ささだ> 前から未定義で…
- <shiro> 明確に禁止された.
- それまでに再定義されてなければコンパイルしちゃうので...
- <higepon> R6RSのweb frameworkができるかも…作ってみようかな
- <shiro> ぜひsrfiとして(笑)
- <shiro> R6RSで間違っていると思うのは,ライブラリをいっぱい書いてみる前に仕様を決めなければならなかったこと
- <ささだ> ライブラリとsrfiの関係は?
- <shiro> srfiは言語仕様よりだいぶ緩い.誰でも参加でき,反対意見があっても通ることがある
- finalになっても,popularでないものはそのまま廃れていくことがある.どれがde factoになるかは時が選択する
- いますぐR6RSを試すには?
- <zick> 操作的意味論をそのままPrologに記述してみた.
- プログラムと,それを簡約したものの関係があるので,それをそのまま記述したら,なんかインタプリタになっていた
- Appendix Aにあるんだが,それがそもそもR6RSのサブセットになってる.でもcall/ccとかも
- R5RSの操作的(?)意味論は難しくてわからない.R6RSのは
- <higepon> まだ3%.あと一年くらいはR6RSと名乗れない…
- <shiro> R5RSにはテストスイートが作られてるけど,完全じゃない.名乗ったもの勝ちかも
- mapが各リストの長さが同じか全てチェックしなければならないというのがあるけど,
- equal?が停止しなければならない,とかも重い
- IkarusやIronはどれくらい出来てる?
- <shiro> PLTも最新版では結構追従してるんじゃないか.
- <higepon> R5RSでR6RSを実現するマクロ(p-syntax??)がある
- <shiro> LispでLispを実装するようなもの.
- これから,R6RSをばりばり使うぜ!という人はどれくらい?
- <higepon> ここにいなかったらどこにいるんだっていう…(笑)
- <shiro> R6RSの書き方を全てきっちり守るのか,なんとなく守ってればいいのか
- Gaucheは完全にR6RS compliantにするつもりはないけど,R6RS風の書き方は提供したい
- <えんどう> それはいつごろ…
- <shiro> 私の予定では,既にいろんなものが出来ているはず(笑)
- <higepon> バッティングは?
- <shiro> いろいろ.wilikiに.
- <higepon> R7RSはいつ?
- <sihro> R6RSで10年.
- R6RSじゃ駄目だという人たちが,R7RSを…
- いろんなコードが出てきて,その中でポータブルとして必要なものが分かってきて,それがR7RSになる,という流れはありかなと思う
- <黒田> algorithmic languageとして消えてしまうのは残念…
- <shiro> last one standingというか,R6RSはPLTの人たちが最後まで頑張った.誰か別の人が頑張れば
- <えんどう> CL/Schemeは,Lispの休戦協定という説だが,Schemeが戦国時代に…
- <shiro> 「フィーチャーを足す必要がないような仕様を作る」というスローガンを作った人が,「この精神が失われるのは…」というメールを書いていた
- 誰か若い人,頑張ってください
gauche.gong
- 1. amachang(天野)さん
- cybozu lab, shibuya js, JavaScript大好き
- 1000speakers
- Schemeは初心者だけど精一杯話します
- きっかけ→どんなものができたか→
- 1000speakersでLispの話を聞いた→いつの間にかScheme実装会に
- JS1.8で,33行
- JSとのシームレスな連携
- (jslambda "function()...") スコープを共有
- (-> obj prop) でJSのプロパティにアクセス
- JQueryのメソッドチェインもできるよ
- スコープの実装
- __proto__を使って実装 (自分になかったらこのオブジェクトを見に行く,みたいなことができる)
- <デモするところで時間がーー!>
- 2. 阿部さん
- <画面が出ない^^;>
- 一番最後に
- 3. 横田さん
- Cyber Earth
- Gaucheで,Google Earthに情報を追加してみた.
- cyberjapan.jpのデータをGoogle Earthに貼り付けて,地方部もより良い精度で見られるように
- cyber-earth.cgi: 位置からKMLを生成
- cyber-earth-cache.cgi: キャッシュ.オフラインでも使えるように
- SXMLで,KMLを生成
- printの羅列はめんどい.SXMLを使うと,XMLをSchemeのリストで表現できるので扱いやすい
- <つづきは公開サイト(Wiliki)で!>
- 4. naoya_tさん
- Gaucheで作る!? PIC電子工作
- 生駒から
- PICkit2 Starter Kitを買ったばかりの初心者
- 開発ツールがWindowsだけ
- Macでやりたい
- asm/disasm作るか
- 時間があればSchemeも実装できるかも,というスペック
- 表示デバイスはLED
- S式で書かれたアセンブラコード→アセンブル→LEDがぴかぴか!
- デモ2
- GDC(最小公倍数)
- ランプが2つ点いた→2進数の3を表す!
- <春から仕事なくて暇なんで,誘ってください>
- 5. yuumiさん
- id:yuum3
- Gauche on Rails
- 昔,卒研でLisp処理系つくった程度
- 「JavaからRubyへ」→「RubyからLispへ」
- RubyといえばRails
- 動的,DSL, コード生成
- それってLispの世界!
- デモ
- gauche-rails demo→雛形生成
- script/generator scaffold todo due:date task:string
- script/server →8080で起動
- <どう見てもscaffoldです\(^o^)/>
- <拍手!>
- View(テンプレート)
- ERBのような,scheme埋め込み
- Controller
- editが一つのactionで!!!
- <継続すげえーー>
- Gacuheは実用的!
- Gauche本査読したけど,役立つよ! (拍手)
- マクロは強力
- 6. 鹿野さん@オーム社
- Gaucheで本を作る
- RailsのAWDwR本とか!
- 祝出版(オーム社じゃないけど)
ほんとのこと言うと,僕が編集したかった- 「Gaucheの本」の話ができないなら,「Gaucheで本」の話を
- オーム社社内でGauche+SXMLが稼働中
- Erlangの翻訳本
- XMLで
- makeする
- XML→SXML(2MB)→20秒くらい→LaTeXに→組版画像が!
- SXMLからLaTeXへの変換ルールをメタプログラミングしている
- 僕らの仕事は原稿のハック
- 原稿ハッキング環境,Gauche
- マルチバイトな関数型言語なところがいい
- 充実したリファレンス
- 周りの人もすごい,c-wrapperとか(→libkakasi)
- xml2tex.scm
- このプレゼンも実は
- 7. kiyokaさん
- オールドタイプ向けWikiエンジン,OldType
- Wikiはもっと楽しくなる!
- オールドタイプ:Emacsやvi,ターミナルを好む
- 問題1:更新がめんどくさい
- 問題2:更新が不安 (ブラウザが落ちたら台無し)
- オールドタイプにとって更新しやすいWikiとは?
- Subversionを直接更新すればいいじゃん
- svn+kahua+el+js
- デモ
- 既に公開されている
- Emacs-w3mで閲覧
- ページに書かれているS式を実行すると,Emacs上で編集できる
- 保存して,コミット(!)
- 反映される
- 更新者名とか.
- 「最近の更新」の変更ログを直接いじって再修正(typoなど)できるようになる予定
- 気にいった方はいますぐアカウント申請!
- 8. hogelogさん
- 「すみません,生一ついいですか」
- PHPはGaucheの夢を見るか
- PHPの拡張を書いて,Gaucheを呼べるようにした
- PHP→皆さん知らないと思うけど,Web用言語
- 「プログラミングしなければいい言語」
- create_functionがあるけど,返り値が文字列
- どこを目指してるのかよくわからない
- 処理系も遅いらしい…
よし俺がPHP7を書いてやる!- そうだ,libgaucheを組み込もう
- GaucheのCインタフェースは非常によく整えられている
- PHPもCで書かれている→libgaucheとの連携はバッチリ!
- <?php scm_eval('(define (fib x) ...'); ?>
- エディタ的に嫌なのでファイルも分けられるようにした
- scm_eval_file
- 高速化にも成功(笑)
- Webからも使える
- PHP拡張のコード含めて200行くらい
- Gaucheに渡してるだけ?
- Cからlibgauche使ってみることも考えてみませんか
- 9. yharaさん
- BiwaSchemeの紹介とデモをしました.
- 10. koguroさん
- glint
- 動的な言語・静的な言語
- Gaucheは動的
- 試しながら作れる / バグがあっても気付かない
- テスト書け?
- バグって実行しないと見つけられないものか?
- (let (a 1) ..) → カッコがたらない
- (let..) 変数名まちがい
- 引数が逆
- 実行しなくても見つかるバグってあるよね!
- コードを解析してバグを検出するツール
- pass1後のIFormを解析(!!)
- 文法チェック,未定義の変数への参照,引数のチェック(experimental)
- Gaucheで5つ,Kahuaで5つのバグを発見(!!)
- glint sample.scm → エラーを表示して
- Emacsのflymakeと合わせても使える!!
- 書いてるそばからエラーチェック
- M-x oshiete-shirosan
- shiroさん人形がエラーをおしえてくれるwwwwwwww
- 重要なお知らせ
- このデモはフィクションですw
- ただし,glint, flymake連携,Gauche-ARToolkitは実在します!
- 2. 阿部さん (リベンジ)
- Gaucheで誤植共有
- Gaucheのよいところ
- Schemeでアルゴリズムを考える・Gaucheのライブラリを作る・Have fun!(動作する)
- typo(fixedpoint.jp)というwebアプリを作っている
- デザイン
- フロントエンド:Prolog!?
- バックエンド:Gauche
- S式で通信
- デモ
- Bookshelf - 出版物のメタファー
- ISBNから登録
- 版や刷の情報も登録できる
- 11. 山田さん
- eval-sv
- 「すこしずつevalして監視」
- 信頼できないプログラムを安全に実行
- Webゲーム・S式バトラー (www
- じゃんけんで戦う
- 行動アルゴリズムをschemeで記述できる
- ユーザがフォームからschemeプログラムを入力→サーバで実行
- 無限ループを書いてもサーバが死なない
- 普通のevalだと,「1万ステップ経ったら終了」とかはできない
- おまけ
- NPCの行動を動的生成したい→メタプログラミング→Scheme.
おまけ(二次会)
shiroさん語録.
- library importの(meta 2)以上は,マクロを生成するマクロの展開時に使うライブラリを読み込むのに使うらしい.
- explicitly naming という,syntax-caseの逆バージョン(つまりhygenicにしたいところだけ"rename"とか"compare"という関数を使う,らしい)がある
- R6RSでも,例えばポート周りなんかは良く出来ている
- ユニットテスト中にネット巡回などしている(RSSMix)
- 表示的意味論になったのは,「引数の評価順序が任意であること」をうまく表現できなかったから
- 任意であると仕様で決められているのは,例えば最適化のため
- 締め切りが近づくほど,短い単位で動作を確かめつつコードを書くようになる.(長いのを一気に書いて動かなかったとき怖いから)
- 実用的な処理系は,実はライブラリの整備などのほうがずっと時間がかかる.
- 例えばGaucheは,最初の3週間で集中してR5RSの範囲を実装したが,それからここまで8年かかった(もちろんずっとGaucheばかりやっていたわけではないけど).
- Gaucheは5つめくらい?のLisp処理系
- 初めから,(当時CLを使っていたように)実用的な処理系を作るのが目標だった.
- 数日悩むようなバグは燃えるほう.
- 問題をうまく選ぶと,てこの原理のように,1人のプログラマでも非常に大きな生産性を上げることができる.てこの支点を見つけるのが重要.
- プログラマの成長は指数的なところがある
- プログラミングができるようになればなるほど,単位時間あたりに学べることが多くなる.
- <higepon> 自分の全盛期がいつ来るか分からないのが怖い.全盛期を最大限に活用するにはどうすれば良い?
- <shiro> 逆にもし,明日か,1ヵ月後か,1年後に全盛期が来るとするなら,そのためにできることは?
- 速度とメモリ消費など,ソフトウェアにはいろいろなトレードオフがある.それらを選択するために,目的を決めることは重要
>fullでないcontinuation<br>スタックを縮めることしかできない継続のことかと思います。<br>setjmp/longjmpとかcatch/throwみたいなものとか。
これは明文化されてます。>3行"異常"の件<br>http://paulgraham.com/info.html