[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 09/01 00:11 / Filesize : 268 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

CommonLisp Scheme Part13



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あたり

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));
 }
};








[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<268KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef