1 名前:デフォルトの名無しさん [2005/05/12(木) 21:44:01 ] 過去スレ Part1: piza2.2ch.net/tech/kako/987/987169286.html Part2: pc.2ch.net/tech/kako/1002/10025/1002584344.html Part3: pc.2ch.net/tech/kako/1008/10082/1008220265.html Part4: pc.2ch.net/tech/kako/1016/10162/1016211619.html Part5: pc3.2ch.net/tech/kako/1023/10230/1023091882.html Part6: pc3.2ch.net/tech/kako/1031/10315/1031560687.html Part7: pc5.2ch.net/tech/kako/1042/10421/1042167213.html Part8: pc5.2ch.net/tech/kako/1058/10582/1058263391.html Part9: pc2.2ch.net/test/read.cgi/tech/1069594582/ Part10: pc5.2ch.net/test/read.cgi/tech/1075630259/ Part11: pc5.2ch.net/test/read.cgi/tech/1091456033/ Part12: pc8.2ch.net/test/read.cgi/tech/1100229366/ 関連リンクは>>2-10 あたり
159 名前:デフォルトの名無しさん mailto:sage [2005/05/30(月) 23:37:05 ] >>154 Schemer: "Buddha is small, clean, and serious." Lispnik: "Buddha is big, has hairy armpits, and laughs." Nikodemus 氏のシグニチャだけど、名言だね。
160 名前:デフォルトの名無しさん mailto:sage [2005/05/30(月) 23:41:22 ] >>158 ググると、Lucid Common Lisp の為に用意されたって記述があるけど 真偽の程はどうでしょう。 Lucid の社長さんって Sun に居た気がしたけど、今どうしてるのかな。
161 名前:デフォルトの名無しさん mailto:sage [2005/05/30(月) 23:53:24 ] >>159 綺麗でかわいいブッダと、 腋毛ボウボウの豪傑ブッダかよ! 科学では、少ない原則でより多くの事柄を説明できる理論を採用する。 すると、Schemeが示そうとしているScienceは一体なんなんだろう。。。 >>160 Lucid 社長・・・わかんない。名前は聞いた事あるけど。 最近、Lisperの臭いをくんくん嗅ぎ分けながら業界のたくってるんだけど、 Frantz社長の名前くらいしか聞かなかった。あとは元Symbolicsで今は紺猿の人とか。
162 名前:デフォルトの名無しさん mailto:sage [2005/05/31(火) 00:06:15 ] 閑話休題
163 名前:デフォルトの名無しさん mailto:sage [2005/05/31(火) 00:42:03 ] Lucid は今の LispWorks じゃないかな。 以前評価したときは Allegro より高速だった(on x86)けど、日本ではマイナーかな。
164 名前:デフォルトの名無しさん mailto:sage [2005/05/31(火) 07:51:23 ] tagged arithmeticって、何?
165 名前:デフォルトの名無しさん [2005/05/31(火) 07:57:43 ] 6月19日-22日に開催されるInternational Lisp Conference 2005のスピーカーリストには、 Richard Gabriel, Sun Labs (Menlo Park, CA) って書いてある。現在も、Sunにいるらしい。 www.international-lisp-conference.org/speakers.html
166 名前:デフォルトの名無しさん mailto:sage [2005/05/31(火) 13:01:32 ] >>164 32bit wordの下位2ビットをタグとして扱うことができる。
167 名前:flatline@Vim%Chalice ◆r6EONKKhcc mailto:sage [2005/05/31(火) 18:24:40 ] サイト移転しますた ttp://user.ecc.u-tokyo.ac.jp/~t50473/
168 名前:flatline@Vim%Chalice ◆r6EONKKhcc mailto:sage [2005/05/31(火) 18:24:55 ] サイト移転しますた ttp://user.ecc.u-tokyo.ac.jp/~t50473/
169 名前:デフォルトの名無しさん mailto:sage [2005/05/31(火) 18:38:51 ] ・・・確かに「lispは25歳以下のスポーツ」と呼ばれるだけの事があるなw
170 名前:デフォルトの名無しさん mailto:sage [2005/05/31(火) 20:01:18 ] >>169 それはつらいなあ.私はヘキサでもギリギリだ.
171 名前:デフォルトの名無しさん mailto:sage [2005/05/31(火) 21:56:57 ] i.loveruby.net/ja/misc/ycombinator.html 上のページの Y-Combinator を,練習を兼ねて Common Lisp に移植してみました. (setf (symbol-function 'Y) #'(lambda (f) ((lambda (proc) (funcall f #'(lambda (arg) (funcall (funcall proc proc) arg)))) #'(lambda (proc) (funcall f #'(lambda (arg) (funcall (funcall proc proc) arg))))))) (setf (symbol-function 'fact0) #'(lambda (f) #'(lambda (n) (if (zerop n) 1 (* n (funcall f (- n 1))))))) (funcall (Y #'fact0) 5) => 120 ...やっぱり大変だ,これ.もっといい書き方はないものでしょうか.
172 名前:デフォルトの名無しさん mailto:sage [2005/05/31(火) 22:52:36 ] (setf (symbol-function ... はムリムリ感が強いなあ。 (defvar Y (lambda (f) ((lambda (proc) (funcall f (lambda (arg) (funcall (funcall proc proc) arg)))) (lambda (proc) (funcall f (lambda (arg) (funcall (funcall proc proc) arg))))))) (defvar fact0 (lambda (f) (lambda (n) (if (zerop n) 1 (* n (funcall f (- n 1))))))) (funcall (funcall Y fact0) 5) => 120
173 名前:デフォルトの名無しさん mailto:sage [2005/05/31(火) 23:07:36 ] >>172 なるほど,無理に関数側にセットするより,funcall を使う前提で変数 側にセットした方が,かえって自然ですね. しかし,funcall が林立するのは,どうしようもないのかなあ.
174 名前:デフォルトの名無しさん mailto:sage [2005/05/31(火) 23:13:58 ] evalが林立するよりはイイw
175 名前:デフォルトの名無しさん mailto:sage [2005/06/01(水) 00:34:04 ] Gauche 0.8.4 キタ━━━━(゚∀゚)━━━━ッ!!
176 名前:デフォルトの名無しさん mailto:sage [2005/06/01(水) 03:35:54 ] >>159 さしずめ Scheme 屋は三論の学僧で Lisp 屋は禅坊主ってところっすか。 仲が悪くてもしかたないな。 >>173 確かに関数をぐるぐる渡していくとなると面倒ですよね。 CPS とかでちょっと書いてみる位でも結構うんざりしたり。 #`(f ...) -> (funcall f ...) とかなリーダマクロでも書いてみるとか。あんま変わらないか。
177 名前:デフォルトの名無しさん mailto:sage [2005/06/01(水) 11:10:12 ] 私は Scheme から入ったのだけど,他の Lisp の良さも知りたいなあ. Schemer と Common Lisper は仲が悪いみたいだけど,どちらも Lisp 文化の 主要な担い手なのだから.Scheme の方が短いコードでその優秀性を示しやす いのか,こういう場では Scheme のよさが目立ちがちな気がする.だけど, Common Lisp の優秀性もぜひお教えいただきたいものです. 自分の知っている例だと,かの「グリーンスパンの第10法則」のグリーンスパ ン氏の blog から philip.greenspun.com/bboard/q-and-a-fetch-msg?msg_id=0006XQ 「Common Lisp はロバストで効率的.Scheme ではハイパワーマシンでもこな せなかった処理を,Common Lisp だと非力なマシンでも成し遂げることができ た」 こんな感じで,自分の知っている言語の良さを出し合っていけたらなあ,と思 うのです.Scheme や Common Lisp や,スレ違いだけど Emacs Lisp までも. (Y-Combinator を Emacs Lisp に移植しようとして,動かない原因がしばら くわからなかったのは秘密.気が付いてみたら当たり前.動的スコープだから クロージャにならないのだもの...絶対に無理)
178 名前:デフォルトの名無しさん mailto:sage [2005/06/01(水) 12:52:55 ] ところで,Common Lisp で,末尾再帰の最適化をやってくれる処理系って,ど んなものがあるでしょうか?xyzzy がバージョンアップしたみたいなので,試 してみたのだけど,やっぱりスタック数40,000 程度でオーバーフロー. (defun tail-rec (x y) (if (<= x 0) y (tail-rec (- x 1) (+ y 1)))) (tail-rec 40000 0) => オーバーフロー Petite Chez Scheme だったら 100,000,000 でも軽々動くのに.こういうのは 再帰にせず,堂々と loop で書くのが Common Lisp 的なのだろうか. (define (tail-rec x y) (if (<= x 0) y (tail-rec (1- x) (1+ y))) (tail-rec 100000000 0) => 100000000
179 名前:デフォルトの名無しさん [2005/06/01(水) 13:04:24 ] >>178 Allegro CLは大丈夫だったよ。
180 名前:デフォルトの名無しさん mailto:sage [2005/06/01(水) 13:06:37 ] >>178 > ところで,Common Lisp で,末尾再帰の最適化をやってくれる処理系って,ど > んなものがあるでしょうか? インタプリタではほとんどの処理系がやってない。 コンパイラではほとんどの処理系がやっている。
181 名前:デフォルトの名無しさん mailto:sage [2005/06/01(水) 13:10:37 ] clispもcmuslも大丈夫じゃない? xyzzyのことはわからないけど、一般的にソースの頭に (optimize speed) と書いておくと末尾再帰をループ扱いしてくれるとか。 速度も上がるだろうしメモリも定量で済むはず。
182 名前:デフォルトの名無しさん mailto:sage [2005/06/01(水) 13:58:05 ] >>178 CLispで試してみた。>>180 氏の言うとおりだった。 [1]> (defun tail-rec (x y) (if (<= x 0) y (tail-rec (- x 1) (+ y 1)))) TAIL-REC [2]> (tail-rec 40000 0) *** - Program stack overflow. RESET [3]> (compile 'tail-rec) TAIL-REC ; NIL ; NIL [4]> (tail-rec 40000 0) 40000 [5]> (tail-rec 10000000 0) 10000000
183 名前:デフォルトの名無しさん mailto:sage [2005/06/01(水) 14:52:06 ] >>182 ディスアセンブルしてみませう。
184 名前:178 mailto:sage [2005/06/01(水) 17:11:03 ] ありがとうございます.今度 Debian に CLisp でもインストールしてみます. Scheme だと ・まずは普通に再帰で書く ・うまく動くようになったら,末尾再帰にして最適化 という書き方をすることが多いですが, Common Lisp だと加えて ・コンパイル という一連のステップで行けばよいということですね. さて,問題は xyzzy です.(optimize speed)も効かなかったし,残念ながら バイトコンパイルしても最適化されませんでした.どのようにコーディングし たら良いものか.やっぱり loop しかないのかなあ...と,そろそろスレ違い ですが.
185 名前:デフォルトの名無しさん mailto:sage [2005/06/01(水) 22:49:23 ] >>184 Common Lisp では末尾呼び出しの最適化が保証されてないんだから 特定の処理系に依存させたくないのなら > Common Lisp だと加えて > ・コンパイル ではなく、繰り返しに展開しないと。
186 名前:デフォルトの名無しさん mailto:sage [2005/06/01(水) 23:22:59 ] >>184 clisp + emacs + slimeでWin上でも結構快適と思うけど。emacsもxyzzyも メモリ消費量は変わらない。 ディスク消費量はemacsの方が多いが。。 なぜかWin上では、clisp 2.33.2ではslimeが動かなかったので、2.33.1にしたら ちゃんと動いた。
187 名前:デフォルトの名無しさん mailto:sage [2005/06/01(水) 23:30:18 ] gauche 0.8.4 cygwin で (- (/ 1 2)) が-0.5にならないよ。 -1/2 (- 0.5) は ok
188 名前:デフォルトの名無しさん mailto:sage [2005/06/02(木) 00:03:46 ] >>177 Y-Combinatorにはならないのだろうが、 lambdaだけで再帰を書くのなら動的スコープのほうが楽じゃない? (funcall ((lambda (f) (lambda (x) (funcall f x))) (lambda (x) (if (= x 0) 1 (* x (funcall f (- x 1)))))) 5) 120 ところで自由変数使わずに束縛変数だけ使うのなら 動的スコープも静的スコープも一緒じゃないの? ちょっとEmacs LispでY-Combinatorやってみるよ。
189 名前:デフォルトの名無しさん mailto:sage [2005/06/02(木) 01:00:57 ] >>15 みたいな格好の閉じ方を初めて見たんだけど、手動でスペース開けてるのかな? 読みやすい様な、読みにくい様な... しばらく真似してみよ.
190 名前:デフォルトの名無しさん mailto:sage [2005/06/02(木) 04:31:42 ] >>184 トランポリンでも仕込んでみるってのはどう?
191 名前:デフォルトの名無しさん mailto:sage [2005/06/02(木) 04:39:47 ] >>187 俺んとこではなるよ。そっちでは何が返ってるんだ?
192 名前:デフォルトの名無しさん mailto:sage [2005/06/02(木) 09:12:17 ] >>190 今は「トランポリン」がイディオムの名前だってこと知らない人多いかもよ?
193 名前:デフォルトの名無しさん [2005/06/02(木) 09:23:34 ] トランポリンというと、gccで入れ子関数を作ったときなどにスタックに 生成される小さなコードのことしか思い出さない。イディオムとしての トランポリンてどういうの?
194 名前:デフォルトの名無しさん mailto:sage [2005/06/02(木) 10:07:13 ] 「なんでも継続」 ttp://www.shiro.dreamhost.com/scheme/docs/cont-j.html を参照してちょ
195 名前:178 mailto:sage [2005/06/02(木) 10:46:43 ] >>185 > ではなく、繰り返しに展開しないと。 うう,再帰を繰り返しに展開するのって,面倒くさいし,バグの元になりませ んか?やっぱり,汎用性を目指すなら,初めから繰り返しで書いた方がいいの かなあ.しかし,再帰のほうがきれいで扱いやすいし... Common Lisper の皆 さんは,普段どのようにお書きなんでしょうか? >>188 > ところで自由変数使わずに束縛変数だけ使うのなら > 動的スコープも静的スコープも一緒じゃないの? それはないです.例えば >>172 の fact0 という関数は lambda 式を返すけど, その式の最後の行の f は,fact0 の外に出たら,動的スコープだと何にも束 縛されなくなっちゃうでしょう?(と言うか,実行するとそのエラーがでる) しかし,動的スコープの方が歴史的には古いのだから,もしかしたら動的スコー プのための Y-Combinator が先に存在していたのかもしれません.私が知らな いだけで. >>192 今は「トランポリン」がイディオムの名前だってこと知らない人多いか >もよ? それは私です.Google検索したら見つかったのが「何でも継続」だったので赤 面.身になってないなあ.
196 名前:178 mailto:sage [2005/06/02(木) 11:08:23 ] >>186 > clisp + emacs + slimeでWin上でも結構快適と思うけど。 じつは,いろいろ思うところがありまして,将来的に個人的な環境をなるべく Linux一本に移行したいと思っているのです.ただ,slime は全然知りません でした.大変便利なものをお教えいただき,ありがとうございました. www.geocities.co.jp/SiliconValley-SanJose/7474/LispDevelopEnvironment.html#slime
197 名前:デフォルトの名無しさん mailto:sage [2005/06/02(木) 12:31:34 ] 漏れはWindowsでもEmacs(Meadow)だなぁ。xyzzyって使ったことないけど良いの?
198 名前:デフォルトの名無しさん mailto:sage [2005/06/02(木) 14:02:50 ] emacsそのものが使いたいのでなければ、 Windows用のemacs風エディタとしてはかなり素敵。
199 名前:デフォルトの名無しさん mailto:sage [2005/06/02(木) 14:12:00 ] Emacs を使う理由の半分以上は本物の Emacs だから、なんだよね。 豊富なライブラリがあるから離れられず、ダイナミックスコープ氏ねと 思いながら Emacs Lisp パッケージのメンテナンスをして、それが... のスパイラル。
200 名前:デフォルトの名無しさん mailto:sage [2005/06/02(木) 14:31:06 ] 使ってみよかと思うが公式Webページは無いのか?>xyzzy
201 名前:デフォルトの名無しさん mailto:sage [2005/06/02(木) 14:38:09 ] ttp://www.jsdlab.co.jp/~kamei/ ttp://xyzzy.s53.xrea.com/wiki/
202 名前:デフォルトの名無しさん mailto:sage [2005/06/02(木) 18:22:12 ] xyzzy は,とんでもなく非力なマシンでもそこそこ動いてくれるのがいい.
203 名前:デフォルトの名無しさん mailto:sage [2005/06/02(木) 18:45:53 ] とことん非力って486でHDが100MBくらいのマシンのこと? 10年前のスペックだな。
204 名前:デフォルトの名無しさん mailto:sage [2005/06/02(木) 20:16:41 ] さすがにそれはきびしいだろうけど、Windows98 が何とか動く程度のマシンなら、 普通に使えてる。確か Pentium の メモリ32メガ。
205 名前:187 mailto:sage [2005/06/02(木) 23:28:18 ] >>191 0.5 が返ります。 ちなみに WINXP HOME SP2 で gcc 3.3.3 。mingw版も駄目 Athron 650 (print (- (/ 1 2))) => 0.5 (print (- (- 1 2)))=> -1 (print (- (+ 1 2)))=> 3 (print (- (* 1 2)))=> 2 (print (- (expt 2 2)))=> -4 (print (- (- 1)))=> -1 (print (- (- (- 1))))=> -1 (print (- (+ (- 1))))=> -1 (print (- (and 1 1)))=> -1 (print (- (or 1 1)))=> -1 (print (/ (/ 1 2)))=> 2.0 (print (/ (- 1 2)))=> -1.0 (print (/ (+ 1 2)))=> 0.3333333333333333 (print (/ (* 1 2)))=> 0.5 (print (/ (- 1)))=> -1.0 (print (/ (- (- 1))))=> -1.0 (print (/ (+ (- 1))))=> -1.0
206 名前:デフォルトの名無しさん mailto:sage [2005/06/02(木) 23:55:40 ] そこまで分かってるならふつーにバグ報告すればいいじゃない ここに書く意図が分からない
207 名前:デフォルトの名無しさん mailto:sage [2005/06/03(金) 00:34:01 ] バグ報告したことないし。
208 名前:デフォルトの名無しさん mailto:sage [2005/06/03(金) 00:51:46 ] ソース確認して直せば即終了やん
209 名前:デフォルトの名無しさん mailto:sage [2005/06/03(金) 13:02:21 ] xyzzy の話を引っ張るんですけど,確かに軽くていいエディタだと思います. 私も便利に使わせていただいてます.だけど,Common Lisp インタプリタとし ては,ちょっと遅いのではないでしょうか? ;;;竹内関数 aka たらいまわしべんち (or 'Common 'Emacs) Lisp (defun tarai (x y z) (if (<= x y) y (tarai (tarai (1- x) y z) (tarai (1- y) z x) (tarai (1- z) x y)))) (tarai 12 6 0) => 12 これの実行に65秒かかりました.バイトコンパイルしても30秒. (Celeron 2.6GHz, 756MB RAM) Petite Chez Scheme なら1秒前後で終わるのですが.
210 名前:デフォルトの名無しさん mailto:sage [2005/06/03(金) 13:15:29 ] tarai懐かしいな。 久しぶりに回してみた。((tarai 12 6 0) @ Athlon FX-55) clisp インタプリタ 12秒 clisp コンパイラ 1.7秒 gcl インタプリタ 12秒 gcl コンパイラ 1.4秒 プチチーズ優秀だね。
211 名前:209 mailto:sage [2005/06/03(金) 13:46:23 ] なるほど,xyzzy Lisp が速いとは言えないけれど,比べた Petite Chez Scheme が速すぎるから,びっくりするような相対値になったのですね. Gauche とかだとどうなんだろう. Emacs Lisp でも試してみようと思ったけれど,エラーになって動かない. (error "Lisp nesting exceeds max-lisp-eval-depth") Emacs はなかなかよく分かりません. あと,野暮かも知れませんが,一応, Chez Scheme => しぇすきーむ Petite Chez Scheme => ぷてぃとしぇすきーむ Paul Graham => ぽーるぐれあむ が原音に近いのではないかと.
212 名前:デフォルトの名無しさん mailto:sage [2005/06/03(金) 14:22:05 ] clisp 2.33.2: インタプリタ 15秒、コンパイラ 2.6秒 Emacs 21.3: インタプリタ 10.4秒、コンパイラ 4.7秒 Gauche 0.8.4: 3.3秒 SBCL 0.9.1: 0.4秒 (tarai 12 6 0) @ Pentium 4 2.4GHz > (error "Lisp nesting exceeds max-lisp-eval-depth") 再帰の深さが変数 max-lisp-eval-depth を超えたってことなんで増やせばいい
213 名前:210 mailto:sage [2005/06/03(金) 15:28:20 ] defunの行とifの行の間に (declare (fixnum x y z)) を入れると gcl のコンパイラのみ 1.4秒→1.2秒になったがその他は変化無し。思ったほど効かないな。
214 名前:デフォルトの名無しさん mailto:sage [2005/06/03(金) 16:18:46 ] >>212 cmuclの結果も知りたい。
215 名前:デフォルトの名無しさん mailto:sage [2005/06/03(金) 16:38:47 ] lisp-worksでやってみた。 インタプリタだと66秒、コンパイルすると1秒以下になった。
216 名前:212 mailto:sage [2005/06/03(金) 17:03:28 ] >>214 CMUCL 19a: インタプリタ: 92秒 コンパイラ: 0.55秒 コンパイラ (declare (type fixnum x y z)): 0.23秒 コンパイラ (declare (optimize speed)): 0.53秒 コンパイラ (declare (optimize speed) (type fixnum x y z)): 0.23秒 SBCL 0.9.1: コンパイラ: 0.42秒 コンパイラ (declare (type fixnum x y z)): 0.31秒 コンパイラ (declare (optimize speed)): 0.38秒 コンパイラ (declare (optimize speed) (type fixnum x y z)): 0.21秒
217 名前:209 mailto:sage [2005/06/03(金) 20:23:37 ] いろいろな方にベンチを実行していただき,ありがとうございます.大変参考 になりました. ところで,おまけとして,ラムダ式による遅延評価版を書いてみました. (参考)www.shiro.dreamhost.com/scheme/wiliki/wiliki2.cgi?Scheme%3a%a4%bf%a4%e9%a4%a4%a4%de%a4%ef%a4%b7%a4%d9%a4%f3%a4%c1 ;;;竹内関数 aka たらいまわしべんち (or 'Common 'Emacs) Lisp ;;;遅延評価版 (defun tarai (x y z) (if (<= (funcall x) (funcall y)) (funcall y) (tarai (lambda () (tarai (lambda () (- (funcall x) 1)) y z)) (lambda () (tarai (lambda () (- (funcall y) 1)) z x)) (lambda () (tarai (lambda () (- (funcall z) 1)) x y))))) こちらだと,引数が12 だとあっという間に終わってしまいますので,数字を 変えました. (tarai (lambda () 192) (lambda () 96) (lambda () 0)) => 192 先ほどの条件で,xyzzy だと13秒程度でした.いささか極端な例とは言え,遅 延評価のありがたみを痛感します.
218 名前:デフォルトの名無しさん mailto:sage [2005/06/04(土) 08:23:03 ] (defun tarai (x y z) (let ((xx (funcall x)) (yy (funcall y))) (if (<= xx yy) yy (let ((x (lambda () xx)) (y (lambda () yy))) (tarai (lambda () (tarai (lambda () (- xx 1)) y z)) (lambda () (tarai (lambda () (- yy 1)) z x)) (lambda () (tarai (lambda () (- (funcall z) 1)) x y)))))))
219 名前:デフォルトの名無しさん mailto:sage [2005/06/04(土) 13:02:22 ] xとyを遅延させる意味が無いように見えるんだが と、LISPをまるで知らない俺が適当に言ってみる
220 名前:デフォルトの名無しさん mailto:sage [2005/06/04(土) 13:31:58 ] 無いね。z だけ遅延させるならこんな感じ? (defun tarai (x y z) (labels ((tarai-1 (x y fz) (if (<= x y) y (let ((z (funcall fz))) (tarai-1 (tarai-1 (1- x) y (lambda () z)) (tarai-1 (1- y) z (lambda () x)) (lambda () (tarai-1 (1- z) x (lambda () y)))))))) (tarai-1 x y (lambda () z))))
221 名前:デフォルトの名無しさん mailto:sage [2005/06/04(土) 22:14:55 ] >>219 >>220 そんじゃ209が早くなったと言っているのは勘違いなの?
222 名前:デフォルトの名無しさん mailto:sage [2005/06/04(土) 22:23:48 ] >>221 >>217 の参考リンクの一番したみてみそ。Zだけの遅延評価のページが紹介されている罠
223 名前:デフォルトの名無しさん [2005/06/05(日) 17:29:43 ] 流れ断ち切って悪いけど DrSchemeって何て読むの? ドクタースキームでいいの?
224 名前:デフォルトの名無しさん [2005/06/05(日) 17:34:22 ] ドラスケ
225 名前:デフォルトの名無しさん mailto:sage [2005/06/05(日) 18:09:09 ] >>224 採用。
226 名前:デフォルトの名無しさん mailto:sage [2005/06/05(日) 23:21:23 ] スキーム博士
227 名前:デフォルトの名無しさん [2005/06/05(日) 23:45:14 ] Note that they are listed as procedures, but implemented as syntax, so it is possible to use a name where the syntactical context implies one (they can also be used as values, but error messages will not have a meaningful name in this case). これどういう意味か分かりますか? どなたか解説をお願いします。
228 名前:デフォルトの名無しさん mailto:sage [2005/06/06(月) 01:08:09 ] のっけからtheyとか代名詞が出てくるんだから、どういう文脈の文章かを 説明しろよな。まあ内容から何の話か見当つくけどさ。
229 名前:?デフォルトの名無しさん mailto:sage [2005/06/06(月) 11:00:03 ] ぬるい実装の話みたいだが...どの処理系だ?
230 名前:デフォルトの名無しさん [2005/06/06(月) 17:33:33 ] >>290-210 Cだと78msec(Pentium4,2.25GHz)でした。 やはりLISPは遅いようですね。 int tarai(int x,int y,int z) { if(x<=y) return y; else return tarai(tarai(x-1,y,z),tarai(y-1,z,x),tarai(z-1,x,y)); }
231 名前:デフォルトの名無しさん mailto:sage [2005/06/06(月) 19:53:32 ] とりあえず空気嫁、と。 空気をどうしても読めなかったら、 悲惨な喪毎の頭のベンチマークでも並べとけと。
232 名前:デフォルトの名無しさん mailto:sage [2005/06/06(月) 20:47:44 ] >>230 >>220 なら sbcl on Pentium 4 2.4GHz で 7μsecだよ。 がんばって遅延評価実装してみ。
233 名前:227 mailto:sage [2005/06/06(月) 20:57:01 ] >>228 ごめん、もう分かった。 >>229 MzScheme です。
234 名前:デフォルトの名無しさん mailto:sage [2005/06/06(月) 21:29:03 ] >>227 R5RS関連だろうと思ってたら、やっぱコレか。 PLT Foreign Interface Manual PLT <scheme@plt-scheme.org> 299.100Released March 2005 download.plt-scheme.org/doc/299.100/pdf/foreign.pdf 2. Foreign Interface This is a description of the foreign interface. The interface has some parts implemented in C (plt/src/foreign/foreign.c) which is available as a built-in #%foreign module. This module is not intended for general use as is, and further documentation can be found in the source. The relevant functionality is provided via the foreign module in MzLib (foreign.ss). 2.2 Simple Types 2.2.4 Type Constructors Since types are first-class values, there are several type constructors that build type objects. These are just the simple ones, more constructors are described below. Note that they are listed as procedures, but implemented as syntax, so it is possible to use a name where the syntactical context implies one (they can also be used as values, but error messages will not have a meaningful name in this case).
235 名前:デフォルトの名無しさん mailto:sage [2005/06/06(月) 21:49:17 ] >>233 お願いだから次からはもうちょっと質問の仕方も上達してくれよ
236 名前:デフォルトの名無しさん mailto:sage [2005/06/06(月) 23:21:44 ] class tarai { int x, y; const tarai* tp; public: tarai(int y) : x(0), y(y), tp(0) {} tarai(int x, int y, const tarai& t) : x(x), y(y), tp(&t) {} int operator()() const { if (x <= y) return y; int z = (*tp)(); return tarai(tarai(x-1,y,*tp)(),tarai(y-1,z,tarai(x))(),tarai(z-1,x,y))(); } }; LISPをまるで知らない俺が五分で作ったC++遅延評価版 tarai(192, 96, tarai(0))()で、0.01秒くらい?
237 名前:デフォルトの名無しさん mailto:sage [2005/06/06(月) 23:53:03 ] tarai(192, 96, 0)と使えるように直した class tarai { int x, y; const tarai* tp; public: tarai(int y) : x(0), y(y), tp(0) {} tarai(int x, int y, const tarai& t) : x(x), y(y), tp(&t) {} operator int() const { if (x <= y) return y; int z = *tp; return tarai(tarai(x-1,y,*tp),tarai(y-1,z,x),tarai(z-1,x,y)); } };
238 名前:209 mailto:sage [2005/06/07(火) 08:18:39 ] 209 です.ろくにレスもしなくてすみませんでした.>>209-237 の流れを,大 変興味深く読ませていただきました.正直,>>236-237 はすばらしいと思いま す. >>232 のレスを見て,自分もC で遅延評価を実装しようと考えて,かなり汚い コードしか思いつかず,ああクロージャ(関数閉包)って本当に便利なんだな, と思った矢先に>>236-237 が書き込まれました.自分は C++ はよく知らない のですが,とてもすっきり書けているように見えます. 日本の Lisp の巨人というと,竹内郁雄先生(たらいまわしべんちの生みの親) と萩谷昌己先生がまず挙げられると思います.竹内先生は「Lispは確かに遅い が,言語としての生産性は格段に高い.トータルのコストはLispの方がずっと 小さい」という考えであり,萩谷先生は「Lisp はあくまでプロトタイプのた めのもので,本物のプログラムは C で書かなければならない」という考えだ と聞いております. Lispというのはとにかく書きやすい言語ですから,解くべき問題の複雑さによっ て,どちらが正しいかは変わるのだと思うのですが,竹内関数(たらいまわし べんち)に関しては,現時点では萩谷教授が正しいということになるようです. この逆説めいた結末に,私は興奮すら覚えました.
239 名前:デフォルトの名無しさん mailto:sage [2005/06/07(火) 08:20:50 ] Bill Clementson's Blog が復活したみたい ttp://bc.tech.coop/blog/ 何時もこっちを見てるけど planet.lisp.org/
240 名前:209 mailto:sage [2005/06/07(火) 08:59:31 ] 今回の流れを見て,もう1つ思い出したのがこの言葉です. 「10年前ならLispは大きなアドバンテージを持っていたけれど、現在は他の言 語が追い付いて来てLispのメリットは小さくなっている。」Peter Norvig 今回のC++のエレガント(と私には見える)な回答を見て,確かにいくつかの 洗練は,Lispの占有物ではなくなったのだ,と感じた方もおられるのではない でしょうか. しかし,聞きかじりで書くのですが,C++にはテンプレートを多用した新しい スタイルが登場しつつあるそうです.それは Lisp や関数型言語から大きな影 響を受けているそうです.つまり,Lisp は2005年の現時点でも,豊かなアイ ディアの源泉でありつづけているのではないでしょうか.もちろん(不幸にも) Lispの進歩が停滞して,その差が縮まりつつあるのかも知れませんが. ところで,Lisp 側は最速のものがまだ出ていません.Allegro Common Lisp (ACL) と Chez Scheme コンパイラの,二つの商用ソフトです.これらなら, C++とも結構いい勝負をするかもしれません. それにしても,最初にたらいまわしべんちを書き込んだ時にはまったく予想し なかった展開になりました.大変勉強になりました.ありがとうございました.
241 名前:209 mailto:sage [2005/06/07(火) 09:01:28 ] 参考リンク(うざいので最後にまとめました) 竹内郁雄『初めての人のためのLISP』 www.amazon.co.jp/exec/obidos/ASIN/4781904548 萩谷昌巳「たかが論理 されど論理」 nicosia.is.s.u-tokyo.ac.jp/pub/essay/hagiya/7bits/saredo Lisp:読み物 www.shiro.dreamhost.com/scheme/wiliki/wiliki2.cgi?Lisp%3a%c6%c9%a4%df%ca\ %aa Modern C++ Design www.amazon.co.jp/exec/obidos/ASIN/4894714353 The Great Computer Language Shootout web.archive.org/web/20030602185735/www.bagley.org/~doug/shootout/craps.s\ html
242 名前:209 mailto:sage [2005/06/07(火) 09:09:16 ] リンク貼り失敗.本当にウザくてごめんなさい. 竹内郁雄『初めての人のためのLISP』 www.amazon.co.jp/exec/obidos/ASIN/4781904548 萩谷昌巳「たかが論理 されど論理」 nicosia.is.s.u-tokyo.ac.jp/pub/essay/hagiya/7bits/saredo Lisp:読み物 www.shiro.dreamhost.com/scheme/wiliki/wiliki2.cgi?Lisp%3a%c6%c9%a4%df%ca%aa Modern C++ Design www.amazon.co.jp/exec/obidos/ASIN/4894714353 The Great Computer Language Shootout web.archive.org/web/20030602185735/www.bagley.org/~doug/shootout/craps.shtml
243 名前:デフォルトの名無しさん mailto:sage [2005/06/07(火) 10:39:40 ] C++のテンプレートは、色々やろうとすると制限が多すぎてちょっと嫌になる
244 名前:デフォルトの名無しさん mailto:sage [2005/06/07(火) 11:21:50 ] >>243 boost の lambda なんかを見ると、一見 Lisp チックなんだけど、正確な挙動を 理解するのはなかなか大変。C++ って複雑な言語だなと思う。 そのくせ、制限が多いというのには同意。 Common Lisp なんかも「大きな言語」と言われるけど、C++ に比べれば子供 みたいなもんだなと思うよ。(もちろん良い意味でね)
245 名前:デフォルトの名無しさん mailto:sage [2005/06/07(火) 11:58:44 ] >>240 過剰なお褒め、恐縮です。というか、気恥ずかしいです でも、自分でも思った以上にエレガントだなと、思っていたり ちなみに、Cでもやってみました CでやるなんてlazyというよりCrazyかとおもったけど 書いてみたら、非常に簡単でした struct tarai { int x, y; const struct tarai* tp; }; int tarai_sub(int x, int y, const struct tarai* tp) { if (x > y) { int z = tarai_sub(tp->x, tp->y, tp->tp); struct tarai t[3] = { { z, z, 0 }, { x, x, 0 }, { y, y, 0 } }; struct tarai tz = { z-1, x, t+2 }; return tarai_sub(tarai_sub(x-1,y,t), tarai_sub(y-1,z,t+1), &tz); } return y; } int tarai(int x, int y, int z) { struct tarai tz = { z, z, 0 }; return tarai_sub(x, y, &tz); } C++よりも、速いっぽい
246 名前:デフォルトの名無しさん mailto:sage [2005/06/07(火) 11:59:15 ] C++版もちょっと手直し int tarai(int x, int y, int z) { class Tarai { int x, y; const Tarai* tp; public: Tarai(int y) : x(y), y(y), tp(0) {} Tarai(int x, int y, const Tarai& t) : x(x), y(y), tp(&t) {} operator int() const { if (x <= y) return y; int z = *tp; return Tarai(Tarai(x-1,y,z), Tarai(y-1,z,x), Tarai(z-1,x,y)); } }; return Tarai(x,y,z); } このコードなら、人に見せても恥ずかしくないかな
247 名前:デフォルトの名無しさん mailto:sage [2005/06/07(火) 12:13:50 ] >>245 struct tarai に tp 入れる必要なくない? typedef struct { int x, y, z; } tarai_t; int tarai(int, int, int); int tarai_1(int x, int y, tarai_t *tp) { if (x <= y) return y; int z = tarai(tp->x, tp->y, tp->z); return tarai_1(tarai(x - 1, y, z), tarai(y - 1, z, x), &(tarai_t){ z - 1, x, y }); } int tarai(int x, int y, int z) { if (x <= y) return y; return tarai_1(tarai(x - 1, y, z), tarai(y - 1, z, x), &(tarai_t){ z - 1, x, y }); }
248 名前:デフォルトの名無しさん mailto:sage [2005/06/07(火) 15:18:08 ] 個人的には興味深い話題ではあるのだけど、延々とC++の話が続くのはさすがに スレ違いだと思う。もうちょっとLisp絡みの話へ軌道修正してほしい。
249 名前:デフォルトの名無しさん mailto:sage [2005/06/07(火) 17:54:02 ] もうちょっとだけ、Cで 245を書いて、247を読んで、ちょっと考えてやっと気づいたんですけど この問題の本質って、実はめちゃめちゃ簡単ですね LISPのコードで書かれてる段階では全く気づかなかったんですけど Cで書いて、読んでみたら、やっと気づきました 必要になるかどうか分からない関数値は、 事前に計算しないで引数のまま渡す タダそれだけですね int tarai(int x, int y, int z); int tarai_sub(int x, int y, int z_x, int z_y, int z_z) { if (x > y) { int z = tarai(z_x, z_y, z_z); return tarai_sub(tarai(x-1,y,z), tarai(y-1,z,x), z-1, x, y); } return y; } int tarai(int x, int y, int z) { return tarai_sub(x, y, z, z, 0); } このコードなら、Cに疎いLISPerの方々でも余裕で理解できるでしょう なんかこう、高度なというか表現力や抽象化能力の高い道具が 問題の本質を逆に隠してしまっていたような、そんな気がします
250 名前:デフォルトの名無しさん mailto:sage [2005/06/07(火) 18:03:57 ] …………………… 頭悪いのが粘着してるの放置 ……………………
251 名前:デフォルトの名無しさん mailto:sage [2005/06/07(火) 18:07:32 ] 確かに。tarai関数の主旨もわからず、Lazy Evaluationの例>>220 の30スレも後になって そんな事言い出すとは、かなり逝かれてるな。 なんつうか、人の話聞いた後「ところで話題変わるんだけど・・・」とか言って同じ話しだすドキュソを思い出した。
252 名前:デフォルトの名無しさん mailto:sage [2005/06/07(火) 18:12:14 ] >>241-242 もかなりイタタ。 こんなの(理系全般板の悪名高い荒らし)にURL覚えられちゃった はぎゃ先生も災難だな
253 名前:デフォルトの名無しさん mailto:sage [2005/06/07(火) 18:27:00 ] >>249 > なんかこう、高度なというか表現力や抽象化能力の高い道具が > 問題の本質を逆に隠してしまっていたような、そんな気がします そんなことないよ。>>220 の labels を分解して (defun tarai (x y z) (labels ((tarai-1 (x y fz) (if (<= x y) y (tarai-2 x y (funcall fz)))) (tarai-2 (x y z) (if (<= x y) y (tarai-1 (tarai-2 (1- x) y z) (tarai-2 (1- y) z x) (lambda () (tarai-2 (1- z) x y)))))) (tarai-2 x y z))) tarai-1 をインライン展開して (defun tarai (x y z) (labels ((tarai-2 (x y z) (if (<= x y) y (let ((xx (tarai-2 (1- x) y z)) (yy (tarai-2 (1- y) z x))) (if (<= xx yy) yy (tarai-2 xx yy (funcall (lambda () (tarai-2 (1- z) x y))))))))) (tarai-2 x y z)))
254 名前:デフォルトの名無しさん mailto:sage [2005/06/07(火) 18:27:54 ] まとめると (defun tarai (x y z) (if (<= x y) y (let ((xx (tarai (1- x) y z)) (yy (tarai (1- y) z x))) (if (<= xx yy) yy (tarai xx yy (tarai (1- z) x y)))))) それを C にすると int tarai(int x, int y, int z) { for (;;) { if (x <= y) return y; int xx = tarai(x - 1, y, z), yy = tarai(y - 1, z, x); if (xx <= yy) return yy; z = tarai(z - 1, x, y); x = xx; y = yy; } } こうなるんだけど、>>249 よりシンプルだし速度も倍。
255 名前:デフォルトの名無しさん mailto:sage [2005/06/07(火) 18:31:21 ] …………………… 頭悪いのが自作自演始めたので放置 ……………………
256 名前:209 mailto:sage [2005/06/07(火) 21:45:06 ] 勝手ながら,flatline 氏の Wiliki を借りました. www.komaba.utmc.or.jp/~flatline/wiliki.cgi?%bb%a8%c3%cc&l=jp このスレでは,ちょっとこれ以上の話は皆さんにご迷惑のようです. しかし,できるならもう少し続けたい気持ちが私にはあります. いっしょにこちらに移動していただけませんか?>> C++ の人
257 名前:209 mailto:sage [2005/06/07(火) 21:48:32 ] 補足.Wilikiのリファレンスです(私も不慣れなのですが). www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?WiLiKi%3a%a5%ea%a5%d5%a5%a1%a5%ec%a5%f3%a5%b9%a5%de%a5%cb%a5%e5%a5%a2%a5%eb ということで,大変ご迷惑をおかけしました.申し訳ありません.>>ALL
258 名前:デフォルトの名無しさん mailto:sage [2005/06/07(火) 22:38:25 ] 今度はwiki荒らしか
259 名前:デフォルトの名無しさん mailto:sage [2005/06/07(火) 22:57:12 ] >>253-254 どうもすみません。勉強になりました 勉強ついでに、249のCコードをそのままLISPにしてみました (defun tarai (x y z) (labels ((tarai-1 (x y zx zy zz) (if (<= x y) y (let ((z (tarai zx zy zz))) (tarai-1 tarai((1- x) y z) tarai((1- y) z x) (1- z) x y))))) (tarai-1 x y z z 0))) そこで、let式を関数呼び出しに変えて (defun tarai (x y z) (labels ((tarai-1 (x y zx zy zz) (if (<= x y) y (tarai-2 (x y (tarai zx zy zz))))) (tarai-2 (x y z) (tarai-1 tarai((1- x) y z) tarai((1- y) z x) (1- z) x y))) (tarai-1 x y z z 0))) さらに、tarai-1呼び出しをlet式に変えてみました (defun tarai (x y z) (labels ((tarai-2 (x y z) (let ((xx (tarai((1- x) y z)) (yy (tarai((1- y) z x))) (if (<= xx yy) yy (tarai-2 (xx yy (tarai (1- z) x y))))))))) (if (<= x y) y (tarai-2 x y z))))