1read 100read
2011年11月2期プログラム42: Lisp Scheme Part33 (346)
TOP カテ一覧 スレ一覧 2ch元 削除依頼 ▼
Lisp Scheme Part33
1 :11/10/09 〜 最終レス :11/11/24 Common Lisp、SchemeをはじめとするLisp族全般のスレです ■前スレ Lisp Scheme Part32 http://hibari.2ch.net/test/read.cgi/tech/1303299696/ ■テンプレ http://wiki.fdiary.net/lisp/ ■関連スレ 【入門】Common Lisp その8【質問よろず】 http://hibari.2ch.net/test/read.cgi/tech/1309940115/
2 : >>1 おつおつ
3 : >>984 前スレ > おれquicklispには非常に期待してるんだ。ネイティブコンパイラのある言語で、 > ああいうライブラリ管理がある言語って、実は少ないんじゃないかしら。 どういうこと? 機能としてのadsfとの違いがわからない。 quicklispの方がインストールできる率が高いぐらいの認識だわ。 Linuxディストリのパッケージ管理ソフトのapt系やyum系やemerge系やArchLinuxのpacman(yaourt)系みたいなことってadsfでできないの? Perlとかはどうなん?
4 : システムがどうこうよりも結局はリポジトリのメンテナンスにどれだけ手間をかけれられるかって話だよね。 Scheme だと http://home.gna.org/dorodango/ http://snow.iro.umontreal.ca/ あたりがそれなりに使えるかな。 使ったこと無いけど。 Checken Scheme だけの話なら egg があるし。 http://wiki.call-cc.org/chicken-projects/egg-index-4.html そういや higepon 氏の言ってた SPON ってどうなったんだろ。 http://wiki.monaos.org/pukiwiki.php?R6RS%2F%BD%B8%C0%D1%BD%EA%2F%A5%A2%A5%A4%A5%C7%A5%A2
5 : >>3 パッケージ管理で気に入ってるのはLeiningenのclojarsリポジトリかな もの凄く楽
6 : >>3 quicklispは依存するライブラリをリポジトリからネットワーク経由して勝手に取ってくるよ。 (要はyumとかaptみたいに) asdfってそんなことできたっけ?
7 : >>6 それはさすがにできる。 検索機能があったかは、ようわからん。 というか、他の仕事でSBCLを触れていなくて、どんどん忘れていく。 作りたいもの、いっぱいあるのになあ。
8 : Clojureだけど、仕事で使える自分は幸せなんだなぁ
9 : Common Lisp では型宣言出来るみたいだけど、Scheme で型宣言出来るような方言ある?
10 : Chickenならforeign-lambdaの戻り値に型指定が必要だから似たようなことができる
11 : Typed Scheme なんてのも
12 : >>11 今は Typed Racket になってるみたいだな。 http://docs.racket-lang.org/ts-guide/index.html Racket は敬遠してたけど、ちょっと手を出してみる。
13 : >>9 KawaいいよKawa
14 : >>12 へー、Type Inference(型推論)がある。暗黙変換あるのかな。
15 : 関数の返値を (list a b) でなくて (values a b) にした方が便利な場合ってのが重いつかない values って何のためにあるの?
16 : >>15 http://practical-scheme.net/wiliki/wiliki.cgi?Scheme%3A%E5%A4%9A%E5%80%A4
17 : >>15 卑近な例だと整数の除算とかだと便利 CLだとtruncate
18 : >15 ハッシュを扱った例を調べてみな。nilがデータ内のnilかデータ内で無いことを 返すためのnilかで使われとる。 たちを扱えるようになってきたら初級から脱却ぢょ。
19 : 動的言語の最適化がしにくい関係で使うものっぽい?
20 : ほとんどのコンパイラはvaluesの結果をリストにせずスタックに積んで返すだけ。 だから明示的にリストにして返すよりメモリ消費が少ない。 だからリフティングにも便利。
21 : >>7 ちょっと遅い反応だけど。 多分、ASDF-Installと混同してる。ASDFはファイル間での依存関係を定義したり、 ロードやコンパイルの手順を統一するための枠組み。makeとかに該当する。 そのASDFの枠組みに乗っかって、ライブラリの導入を自動化するのが、 ASDF-InstallやQuicklisp。こちらはCPANやRubyGemsとかと同じ層の枠組み。 ライブラリの自動ダウンロードや検索をするのはこっち。
22 : >>15 性能が必要なとき、コンシングを避けるために使える。 >>16 のリンク先にもあるけど、意味論上の理由を無視すれば、 単に性能への要求が全て。同じことは大体はリストでもできる。 Schemeでの(values)とかの例外を除いて。 多値にあまり必要性を感じない人は結構いて、Gerald Jay Sussmanなんかは ttp://trac.sacrideo.us/wg/wiki/WG1Ballot1Results > It is important to allow multiple values that can result in multiple definitions > and assignments, but it is not apparent to me why we need a special data > type to implement them. って言ってる。
23 : 普通に考えれば構造体でも定義して返せばいいわけだし、 わざわざ特殊なものを積極的に使う理由にはならないなあ >>18 の例にしてもnilと区別したいならノードを返すとか他にいくらでも方法はあるわけで
24 : >>23 何かにラップして返すと、受ける側でアンラップしなきゃならん。 変数に束縛する場合はdestructuring-bindとかパターンマッチが使えるが、 最初の値だけそのまま他の関数に渡したい場合などは一手間余分にかかるし。 それから、APIの互換性を保ったまま後付けで余分な値を返すようにできるのは 仕事でコード書いてると重宝する。単独の値→構造体へと戻り値を変更したら 呼び出してるところ変えて回らないとならないからなあ。 Schemeの多値は二番目以降の値を無視するような使い方ができないので 性能上の要求以外で使うメリットはあまり感じないが。
25 : CLの多値は使わない分を捨てられたり、足らない分をnilで補ってくれて嬉しいんだけど、 たまに、一部の値を返し忘れてるのをnilにされちゃって、バグの原因に気付けずに頭がおかしくなって死ぬ。
26 : >>23 特殊かなぁ? 謎だ。Haskellのように、Maybe/Eitherを定義すればできるけど
27 : >>23 「わざわざ××でなくても○○でいい」という主張は説得力に欠けると思う。 ××と○○のどちらに重みを置くかで簡単に逆転するもの。 実際、「わざわざ多値でなくても構造体でいい」という主張に対して >>24 は「わざわざ構造体を使うより多値」って反論だろう。 だけどこの反論は「手間」に焦点をあてて重みを具体的に主張してるのでそれなりに説得力がある。 こういうときには構造体の方が手間が小さいとか、こういうときは手間をかけてもなお構造体の方がいいとか、 「多値を使う理由がない」よりも「構造体を使う理由がある」で主張してくれた方が良い議論になりそうな気がする。
28 : じゃ言うけど、 多値で返す値は順番に依存してるのが良くないんだよ 構造体は名前を使えるぶん間違いが少ないし順序を変えたりするのも楽 それとSchemeで性能とか言われても説得力がない 構造体返しても最適化のレヴェルはほぼ同じだし どうすかね
29 : 下らねえ。
30 : ↑そういう応えしか返ってこないんなら反論無しと受け取るよ 構造体はそれ1つを知ってればいいが、 多値は関数それぞれが何を返すのか知ってないといけないのに加えて、 その順番には何の根拠もないから仕様変更に弱い 後で何か付け足す場合とか考えないのかな? 普通に考えれば積極的に使う物ではないという判断に至ると思う
31 : だから多値を推すなら名前付きにしろって思うんだよ 関数引数にも言える事だけど
32 : まあ、関数の引数が見逃されてきたのは、 呼び出し側のインターフェースで引数を強制してるからだけどね 可変長引数の使いにくさを見れば多値がいかに迂闊なインターフェースか判ると思う
33 : 多値のせいで例外処理みたいなすっ飛んでく処理とか複雑になってしまわない? 例外受け取っても何が入ってるか判らんとか R6RS以降追ってないけど
34 : 順番に依存よくないな!Scheme みたいな狭い世界じゃなくて、 数学の世界を名前付き引数に改革しようぜ!
35 : (set! result (lambda() (values 1 2 3))) result => 1 (ref-values result 0) => 1 (ref-values result 1) => 2 (ref-values result 2) => 3 とかw 嫌んなっちゃうな
36 : おっと、括弧が1たりないw
37 : つまり多値がファーストクラスでないのがいけねえんだってことね
38 : >>35 何でdestructuringするマクロ使わんのだ。 単にreceiveとかcall-with-valuesの下でリストやベクタ、 構造体を使えば良いだけで、他からは隠蔽できる。 この辺の話は全部>>16 と参照元に書いてるよ。
39 : >>28 「Schemeで性能と言っても説得力がない」と言われちゃうと Schemeで準リアルタイムシステム書いてる自分の立つ瀬がないんだが。 構造体を作って返すと、最適化でアロケーションを消してもらうのは大変で、 Stalinみたいに全プログラム解析をやるハメになる。多値なら アロケーションが起きないことが(使ってる処理系で)保証される。 最近GCの性能は上がってるとはいえ、no consingで書くのはバカにならないよ。 そんなコードをSchemeでわざわざ書くな、と言われたらサーセンとしか言えないが。
40 : >>28 >>30 Schemeでの性能の話に説得力がないとか言われてもなー。 現実で業務とかに使ってる人もいるし、StalinとかはCLの処理系と戦えると思うけど。 それと、構造体を現状の多値の代わりに、というのは色々問題出ると思う。 少なくとも、返す側の関数単体じゃそれが多値の代用として使われるかどうか判断できないから、 Lisp語族で当たり前に行われる、インタラクティブにコンパイルする場合、最適化できないよね? この辺は自分は詳しくはないので、解決する方法はあるのかもしれないけど。 現実的な(将来コンパイラが十分に賢くなったら、とかでなく)範囲であるなら教えて欲しい。
41 : 被ったw あと、要素の追加や削除が将来的に起きそうな場所を抽象化するのは当然で、 どこで多値を使うかはケースバイケースだと思う。>>30 は極論に見える。 関数の引数と同じで、固定できる部分は複数の値で、他は抽象化されたものを。 そんなにおかしい話かな?
42 : すっごく素朴な疑問で悪いんだが、多値で使われなかった値って、 そのうちGCされる、って理解で正しい?
43 : >>42 CLの場合だとスタックに戻されるような実装(コンパイラ)が多数を占めてるからGC対象ですらない。
44 : 値渡ししかできないわけじゃないんだし 効率重視なら多値なんて使わない方がいいけどな
45 : 関数から戻るたびにmake-*するよりはましかと。
46 : 副作用を使っちゃうと、状態を変更する関数を呼んだ後に以前の状態を必要とする可能性がある場合、 オブジェクトをコピーしないといけないから、副作用を伴わない多値のが効率が良いこともあると思うよ。
47 : 多値についてたちが悪い議論はもうやめようよ。
48 : call/ccで単純に関数の中途で大域脱出し、 デバッグ用途(イミディエイト機能のような)に使いたいのですが、 例を教えていただけませんか。 いまいちcall/ccを使うタイミングがわからないのです
49 : >>48 イミディエイト機能って何? ググってもわからなんだ。 Chez Scheme とかではエラーのときにデバッグモードになるけど、あんな感じのこと? 汎用的に作るのは難しいか出来ないと思うけど、とりあえず使用例みたいなので目的とするところを示してくれんか。
50 : >>49 ベクターを操作する巨大な関数です。 一ループごとに文字列を読み込み、見合った操作をして文字列の先頭を削り再帰します。 (define interprit (lambda (program memory offset) (cond ((eqv? programの先頭 #\a) 処理) ... ) ;*ここで脱出* (interprit 削ったprogram memory offset) ) ) ループする毎に継続をset!して脱出し、 処理を確認したら戻りたいです
51 : >>50 「処理を確認」をもう少し詳しく。 なんとなく、ブレークポイントを設定してローカルな変数を見たいのかな、 とか思うんだけど、どうなんだろう。
52 : >>51 大域変数を確認したいです。
53 : 最初はcondないの内部処理は、各条件ごとの内容をそれそれ別関数にまとめて 作って、ひとつの関数から、cond条件わけの関数とそれぞれの関数に分けて作った ほうが最初はいいよ。そのほうが読みやすくなるので。 何もかも一つでやらそうとするのはあまりいい傾向だとは思えない。
54 : >>50 その処理を一般化すると「ループからジェネレータへの変換」と考えられる。 これがそのまま使えると思う。 http://practical-scheme.net/wiliki/wiliki.cgi?Scheme%3agenerator%E3%81%A8do%E3%81%A8while#H-3put3dsr6wpqj call/cc を使う典型的な例なので call/cc の解説の中では似たようなコードはよくある。 限定継続を提供している処理系ならともっと簡単に書ける。 http://practical-scheme.net/wiliki/wiliki.cgi?Scheme%3a%E9%83%A8%E5%88%86%E7%B6%99%E7%B6%9A%3a%E3%82%A4%E3%83%86%E3%83%AC%E3%83%BC%E3%82%BF%E3%81%AE%E5%8F%8D%E8%BB%A2 そういや限定継続って規格に入ってないし、 srfi にもなってないっぽいなぁ。 racket には shit と reset だけじゃなくていくつかのバリエーションがあるみたいだね。
55 : >>53-54 くわしくありがとうございました。
56 : 余談ではありますが、 call/ccとdelayを用いてpromiseを返却し、逐一動作が出来ました。
57 : gambitcやchikenでvalues使うと大幅に速度が上がるっていうなら できるだけ使うように心がけるかな
58 : >>54 糞コテは巣に帰れ
59 : >>58 SCHEME餃子の巣はやっぱSchemeスレなんじゃね?
60 : shibuya.lisp はどーだった?
61 : クロージャスレから引越しというか。 授業が奥乃先生と複数担当態勢だったりしたのは引き継ぎの目的もあったのかな。 最終講義のアナウンスがあるとしたら年明けかな?
62 : >>60 Shibuya.lisp TT#7の動画をニコニコ動画とYouTubeにアップしました。 http://www.nicovideo.jp/mylist/28336529 http://www.youtube.com/playlist?list=PLEAB9C327450DA7D3
63 : 某氏と某氏のトラブルも収まったのかな。 Shibuyaでは喋らんと言ってたけど 良かったんじゃない?
64 : 一応当時、熱くなって申し訳ない、みたいな感じで本人謝罪してたよ。 あとは、相手もう運営側から手を引いてるし。 何にせよ、また出てくれたのは良かったね。
65 : >>62 ひげぽん氏の声はよく聞こえて良い。 滑舌が悪い人や、集音がイマイチなときがあったりするのはなんとかならんかな。 マイクゲインも大きすぎると雑音も拾うから骨伝導タイプのマイクを使うとか。 それと、映像はもう直接PCに繋げちゃってもいいような気がする。
66 : でかい会場のスクリーンでは見えるけど、中継では見づらい、という場面で ズームしたり、身振りが入った説明をしてるのでカメラを振ったり、という時に 中継担当者の手間が増えるので、そのへんは微妙かも。
67 : >>66 多くは発表資料も公開してるからそっち見ながらでだいたい問題ないかもな。
68 : これだけ後からスライドの画像を入れてるけど、こういうのはやっぱ結構手間かかるのかな。 http://www.nicovideo.jp/watch/sm5008319 見易さ的には好ましいとは思うけど、 資料見ながら聞けば済む話ではあるからそこまでするほどのもんでもないって言えばそうだしなぁ。
69 : なあ、Monaの開発は順調さ build5 http://hibari.2ch.net/test/read.cgi/os/1314741952/
70 : スライド画像で差し替えるのは、ページ送りをプレゼン時と同じタイミングにするのが結構難しいです。 元映像見ながらだとなんか微妙にずれるので、わずかに入っているスペースキーを叩く音とかを手がかりにしてました。 あと、音声についてはいつも悩ましくて、人により声質やマイクの持ち方が違うのでなかなか安定しません。 あまりに聞き取りづらいのは、編集時にボリューム変えてますけど、あまりやり過ぎると雑音まみれの変な音になるので悩ましいところです。 発表者の机の上にボイスレコーダを置いておいて、あとから合成するのがいいと思うけど、これもマーカーみたいなのがないと合わせるのがちょっと難しかったり。
71 : UST中継では入力オーバーっぽいノイズ入ったりしてたよね。
72 : 音割れしてるのがひとつあって、体調も悪かったからそのまま切っちゃったんだけど、 あれは音量の調整のミスなのか、発表者の声が大きすぎたのか。 さておき、いつも動画アップロードお疲れ様です。
73 : ヘッドセットやピンマイクで強制するとか? いや、そういう面倒な事こそLISPを活用してだな
74 : どう頑張ろうと声の大きさを一定にすることは無理でしょ。声出してるのが プロのアナウンサーとかじゃないんだから。 最初のAD変換で音が割れたりしてたらリカバリーのしようがないので、 そこの機材で入力レベルの調整をすればいいんだけども。
75 : ・マイクを違う距離に数台用意してマルチトラック録音して後で選別する ・音圧拾ってレールかなんかで距離を自動調節する装置を作る
76 : PCMレコーダーに自動レベル調整機能が付いてるものがあるようだけど、 PCだと難しいんかな?
77 : 細かいこと気にすんなよ 音割れしてたら見るのやめる程度の内容なんだから
78 : RIP
79 : ご冥福を祈ります。
80 : ジョブス、リッチーに続いてマッカーシーまでもか。 R.I.P.
81 : ttp://jp.techcrunch.com/archives/20111024creator-of-lisp-john-mccarthy-dead-at-84/ えええええ
82 : こんどはマッカーシーが天寿を全うしたのか。 RIP
83 : >>77 発 者 同 . 。_ ____ 争 生 同 .じ . /´ | (ゝ___) い .し 士 .レ .__/'r-┴<ゝi,,ノ ro、 は、 .な で .ベ ∠ゝ (ゝ.//` ./`| }⌒j .い し .ル } ⌒ /`ヽ、_∠l,ノ ・ヽ´ .! ! か の / ´..:.} >、、___, .r、 ソ、`\ / ..:.:.} / |∨ ` ̄ / ..:.:./ | 丶 / _、 ..:.:.:.{ .{.:.:. \ { ..:Y .ゝ、 {.:.:.:.:. ヽ |、 ..:/ 丿 .:〉 >.- ⌒ . ヽ / {. ..:./ ソ ..:./ .( ..:.:.:` ..:} ./..:.:}.:.:./ ヘ、 ..:./ .\ ..:.:r_,ノ、.:.:} ./..:.:/|.:/ {.:./ X.:.:}.} X X /..:.:/ .}.:| }:/ .Y丶ヽ Y.:Y . __/.:/ { } 《.〈、 _,,__>.:》丶 Y.:\ /.:.:.:.:.::/ !.:.:ゝ ゝ.:. ̄ヾ ´:.:.:.:.:.:.:.:.:ヾゝ \.: ̄>
84 : あびしーえる1.0リリースだって http://abcl-dev.blogspot.com/2011/10/abcl-100-released.html
85 : http://hatsukari.2ch.net/test/read.cgi/news/1319513713/ ν速にはスレが立った。マ板はまだだが。
86 : 某声優ユニットの方も7月で活動終わってた QEPD
87 : http://toki.2ch.net/test/read.cgi/scienceplus/1319679294/
88 : GCもマッカーシー由来だったの
89 : (define (f x) (define-macro (bl) '(if (> x 0 ) #t #f)) (bl) ) (f 10) racketでは動くけど、他の処理系ではやっちゃいけない?
90 : そもそもdefine-macro自体がRnRSにないので、 あんま気にしても仕方ないと思う。
91 : define-macro は RnRS で提供して無いけど、 R6RS では簡単に define-macro を実装できる。 典型的な実装例はこんな感じ。 (define-syntax define-macro (lambda (stx) (syntax-case stx () ((_ (macro . args) body) #'(define-macro macro (lambda args body))) ((_ macro transformer) #'(define-syntax macro (lambda(stx2) (syntax-case stx2 () ((k args (... ...)) (let ((v (syntax->datum #'(args (... ...))))) (datum->syntax #'k (apply transformer v))))))))))) これなら >>89 のようなことは問題なく出来る。 でもまぁ Scheme 的には let-syntax を使う方が楽ではあるだろうね。
92 : なんだよボーイズラブって
93 : 限定継続使われてないからメモリーリークしてたんかね http://groups.google.com/group/plt-scheme/browse_thread/thread/a310b7cba8fae651/fa85558e8a5115bf
94 : じゃあこんなのも問題ないのね でも `[`(,,op ,'y) あたりがうまく動いてくれない (define (g x) (define-macro (tmpl op) `[`(,,op ,'y) (list y ,op)]) (match x [`(- ,z) (list z '-)] (tmpl '+) ) )
95 : >>91 各処理系がdefine-macroをどう実装してるかが問題なんだから、 RnRSでdefine-macroをどう実装するかはこの場合関係ないだろ。 独自の定義でオリジナルを上書きして差異を吸収するってんなら別だけど。
96 : 結局、期待通りに動きませんでした。何がいけないのかよくわからない。 (define-syntax tmpl (syntax-rules () ((_ op) [(list op y) (list y op)]))) (define (g x) (match x [`(- ,z) (list z '-)] [(list '/ z) (list z '/)] (tmpl '+) [_ 'else] ) ) (g '(/ 8)) (g '(+ 10)) (g '(- 12)) (g '(= 19))
97 : 何を期待してるのか判らんから助言しようもないが、 matchの仕様を見るにpat部分は普通の評価はされない場所だから 何か勘違いしてるんだろ。例えばパターンの最初の2行は [(- z) (list z '-)] [(/ z) (list z '/)] でいいんじゃないかと。 tmplもそう書き直せば多分動くでしょ。 全く確認してないが。
98 : あ、だからpat部分は評価されないからダメだよ 出てくるシンボルは「パターン変数」になるそうだから。仕様よく読め。
99 : おまいらそんなに括弧が好きなの? かっこつけんなよ。
100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼 ▲