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


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

CommonLisp Scheme Part11



1 名前:デフォルトの名無しさん mailto:sage [04/08/02 23:13]
過去スレ
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: ruku.qp.tc/dat2ch/0311/20/1042167213.html
Part8: pc2.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/

関連リンクは>>2-10あたり


29 名前:デフォルトの名無しさん mailto:sage [04/08/12 00:21]
WiLiKiの件はWinAPIのとこでど素人っぷりを晒している気の毒な人に
叱咤してるのがそれかなと思ったら、しょ〜もないことする奴が居るんだね〜。
あきれたもんだ。

>>28 は第5世代コンピュータとか、その辺りじゃないの?

30 名前:デフォルトの名無しさん mailto:sage [04/08/12 00:42]
形式

31 名前:デフォルトの名無しさん mailto:sage [04/08/12 09:43]
symbolicsとかの lisp machineがあったころじゃ、lisp全盛期って。
とはいうものの、日本ではそんな栄えてなかったから定訳はないとか。


32 名前:part10 の >>968 mailto:sage [04/08/12 20:38]
part10 の >>988

clisp を windowsXP で,日本語ディレクトリ以下で使う件です.
CP932 が無くて自動的に UTF-8 になっていたわけですが,
impnotes.html によると libiconv が必要のようです.

とりあえず色々なところに gnuwin32 の libiconv を置いてみましたが,
できませんでした.
impnotes.html が言う「libiconv のインストール」とは,windows では
どういうことになるのでしょうか.

33 名前:968じゃないけど mailto:sage [04/08/12 21:47]
>>32
libiconvを適当なディレクトリにインストールし、そのディレクトリを
指定してコンパイルしなおすってこと。
sourceforgeやcygwinで配ってるバイナリだと日本語は使えないよ。

34 名前:デフォルトの名無しさん mailto:sage [04/08/13 04:37]
S式を捨ててM式やそれに似た構文を採用した言語もLispと呼んでいいなら
Lispの全盛期は現在 (苦しいか)

35 名前:デフォルトの名無しさん mailto:sage [04/08/13 07:05]
M式の言語って具体的には何ですか?

36 名前:デフォルトの名無しさん mailto:sage [04/08/13 20:53]
>>35
M式をさらにヘンテコな構文にしたLisp方言:
Perl、Python、Ruby...

37 名前:32 mailto:sage [04/08/13 21:47]
>>33
そうですか...orz

minGW でも build できればいいのですが.



38 名前:デフォルトの名無しさん mailto:sage [04/08/13 23:19]
日本での全盛期はELISとTAOの頃です

39 名前:デフォルトの名無しさん mailto:sage [04/08/14 00:14]
>>34
そんなの考えなくても現在が全盛期でさらに成長中。
たとえば、インストールベースについて考えてみる。IDCによると、
2003年には約1000万台のLinuxデスクトップが出荷されている。
ほとんど全てのディストリビューションにおいてデスクトップ環境
には何らかのLisp処理系が含まれ、Linuxデスクトップにはさらなる
成長の余地が期待されることを考えると、Lispの出荷数は現在が
過去最大であり、今後さらに伸びることが期待される。
プログラマの数だと、Emacs Lispやguile-gtkを利用したプロジェ
クトのメンバー数だけを見ても順調に伸びている。
利用者数にいたっては、webアプリのサーバサイドで使用され、
それと知らずに利用してるユーザーの数なんて数え切れない。
>>29,31,38の頃と比べるとシェアは減ってるかもしれないけど、
それ以上にパイが広がってるのが現在だと思う。

40 名前:デフォルトの名無しさん mailto:sage [04/08/14 03:56]
いつまでたってもマイナーなのは変わらんけどね

41 名前:デフォルトの名無しさん mailto:sage [04/08/14 10:04]
猿でも分かる guile プログラミング
〜 unix tool イージー拡張プログラミング 〜

見たいな tutorial があると助かるんだけどな〜。
Scheme の知識は前提にしてていいから。

42 名前:デフォルトの名無しさん mailto:sage [04/08/15 01:30]
>>40
10月に月刊 Lisp Magazine が創刊されるから
メジャーになるんじゃない?



43 名前:デフォルトの名無しさん mailto:sage [04/08/15 13:40]
>>42
マジ?w

44 名前:デフォルトの名無しさん mailto:sage [04/08/15 15:43]
float についての挙動がいまいち掴めません.教えてください.

ソースの最初に (setf *read-default-float-format* 'double-float) と
書いておくと,それ以降の `2e0' や '2.0' は double-float として
扱われるのですよね?
また,
  (setf b (* 2.0 2)) ==> 4.0
  (type-of b) ==> DOUBLE-FLOAT
となるのに,
  (setf a (atan 1)) ==> 0.7853981f0
  (type-of a) ==> SINGLE-FLOAT
となってしまいます.
全てを double-float にしたいです.どのようにすればよいのでしょうか.

45 名前:デフォルトの名無しさん mailto:sage [04/08/15 17:18]
(setf a (atan 1.0)) ではどう?

46 名前:44 mailto:sage [04/08/15 20:20]
>>45
あっ,すみません.それは気づいていました.
ちゃんと *read-default-float-format* が反映されます.

ソース内の全ての float を double-float にするつもりで
いろいろやったのですが,warning が出てしまっているので,
手順として
1. (setf *read-default-float-format* 'double-float)
2. int を float 表記に.(例: `1' を `1.0' や `1e0' に)
をやったのですが,不十分らしいのです.
3. とにかくリテラルを `1d0' に.
もやりましたが,まだ warning が出ます.

どうすれば完全に double-float だけのソースにできるのでしょうか.

47 名前:デフォルトの名無しさん mailto:sage [04/08/15 21:01]
それはリード時にdouble floatにするだけでしょ。



48 名前:デフォルトの名無しさん mailto:sage [04/08/15 21:04]
www.geocities.jp/bneck44/hS.htm
scheme + HSPって感じだな。

49 名前:デフォルトの名無しさん mailto:sage [04/08/15 21:54]
librep みたいなのの Windows 版になれば便利かも

50 名前:44 mailto:sage [04/08/15 22:08]
>>47
ごめんなさい.よく意味が飲み込めません...
ソース内のリテラルには効果無しですか? ちゃんと変わっているようにも見えますが...

数値計算をさせている方々は,どんな方針で float を扱っているのでしょうか.
single-float ではちょっと足りない感じはありませんか?
処理系依存なところが多くてどうしたらいいか途方に暮れています.

51 名前:デフォルトの名無しさん mailto:sage [04/08/15 22:22]
>>48 今、回線が細くてソース下して読む気にならないんで、ソース読んだ人
いたら教えてください。

Tiny Scheme 派生ということなんですが、文字列の長さ制限はどうなってます
か。


52 名前:デフォルトの名無しさん mailto:sage [04/08/15 22:30]
>>46
規格を調べてないから間違ってるかもしれないけど
(atan) とかの関数が返すfloatの精度は処理系依存だったような気がする。
この点は、>>45 がうまくいっているなら大丈夫として、

>3. とにかくリテラルを `1d0' に.
>もやりましたが,まだ warning が出ます.

integer が必要なところまで floatにしてない?
(elt '(a b c d) 1d0) とかは通らないよ。

53 名前:44 mailto:sage [04/08/15 23:56]
>>52
> integer が必要なところまで floatにしてない?

大丈夫です.cmucl や sbcl では warning が出ないので,
clisp 2.33.2 が何か間違えているのかと思いましたが,
CLHS で *read-default-float-format* の example を試してみたら
cmucl と sbcl は single-float と double-float しか実装されていないんですね...
cmucl を使っていれば何も知らずに過ごせるんですね...

ところで,sbcl ってちょっと bug ありませんか?
dotimes から (return) しようとするとコンパイルが通らないのです.
簡単なテストではうまくいくのですが.

54 名前:デフォルトの名無しさん mailto:sage [04/08/16 02:08]
>>42
ソースきぼんぬ。

55 名前:デフォルトの名無しさん mailto:sage [04/08/16 02:33]
月刊 Lisp Magazine
創刊号の付録は lambda closure の実装
9号まで集めると簡単に最適化 Lisp コンパイラが組めます。

その他、継続号を入手するのが困難な季刊 Schemer (予定)とか、
必要な時にだけ発行される Haskell User (未定)とか。

56 名前:デフォルトの名無しさん mailto:sage [04/08/16 03:22]
> 必要な時にだけ発行される Haskell User (未定)とか。

lazyだけにいつまで待っても出ないヨカーン


57 名前:デフォルトの名無しさん mailto:sage [04/08/16 10:04]
読者が読むまで記事が書かれません




58 名前:デフォルトの名無しさん [04/08/16 11:44]
>>51
#define LINESIZE 1024
char linebuff[LINESIZE];
char strbuff[256];




59 名前:デフォルトの名無しさん mailto:sage [04/08/16 21:46]
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄」
―――――――――――――‐┬┘
                        |
       ____.____    |
     |        |        |   |
     |        | ∧_∧ |   |
     |        |( ´∀`)つ ミ |
     |        |/ ⊃  ノ |   |  J ←さじ
        ̄ ̄ ̄ ̄' ̄ ̄ ̄ ̄   

60 名前:デフォルトの名無しさん mailto:sage [04/08/16 21:56]
>>55 月刊 Lisp Magazine か Lisp Wizard 探訪 とかやってくれんかなぁ
今どこで Lisp が使われているか本当に知りたいよ





61 名前:デフォルトの名無しさん mailto:sage [04/08/16 22:32]
昔、bitにはLispの連載があったよなぁ。。


62 名前:デフォルトの名無しさん mailto:sage [04/08/16 22:51]
Good Old Days
λ...

63 名前:デフォルトの名無しさん mailto:sage [04/08/16 23:24]
Gauche-devel-jpのshelarcyがいたい。
webも痛い。page.freett.com/shelarcy/

64 名前:デフォルトの名無しさん mailto:sage [04/08/17 00:35]
ウォチは板違いってテンプレに書いておいた方が良さそうだな

65 名前:デフォルトの名無しさん mailto:sage [04/08/17 00:41]
結局、月刊 Lisp Magazine はネタですか?
残念。

66 名前:デフォルトの名無しさん mailto:sage [04/08/17 00:41]
>>64
やってんのは一人だろ、どうせ。何のつもりか知らんが。

67 名前:デフォルトの名無しさん mailto:sage [04/08/17 14:41]
Lisp関係ないじゃん



68 名前:デフォルトの名無しさん mailto:sage [04/08/17 21:57]
>>63
あれは誰かがサクっと書いて「ほれ。」と出して黙らせるしかないんじゃないかな。
放置が一番でしょう。
川合さんのメールは似たような奴を相手にしたら使えそうなので、
それを引き出したという点では価値があるといえる(w


69 名前:デフォルトの名無しさん mailto:sage [04/08/17 22:59]
あれは単に匙を投げられただけでわ

70 名前:デフォルトの名無しさん mailto:sage [04/08/18 04:06]
R*RSでは伝統的なマクロ(不健全なマクロ)をサポートする気はないのかな?
もうすでに却下されているのかな?

71 名前:デフォルトの名無しさん mailto:sage [04/08/18 10:32]
>>70
一体何のために?


72 名前:デフォルトの名無しさん mailto:sage [04/08/18 12:50]
hygienic の対義語が不健全か。その表現いいねー
(defmacro sekusu (timpo mamco)
`(insert ,(if (hokei-p timpo) ...
とかやっちゃうわけだ。ハァハァ

73 名前:デフォルトの名無しさん mailto:sage [04/08/18 17:14]
Scheme の健全マクロを学ぶのに、おすすめのページはありますか?


74 名前:デフォルトの名無しさん mailto:sage [04/08/18 18:33]
>>73
ないよ

75 名前:デフォルトの名無しさん mailto:sage [04/08/18 19:08]
>>73
とりあえずブックマークにこんなの入ってた。
home.comcast.net/%7Eprunesquallor/macro.txt

76 名前:デフォルトの名無しさん mailto:sage [04/08/18 19:47]
>>73
前スレ(Part 10)の786にも書いたんだけど、
Schemeの健全マクロについては、

・日本語

オンラインで読める文献は >>5 に出てる「入門Scheme」以外にないと
思う。pdf ファイル。
#www4.ocn.ne.jp/~inukai/scheme_primer_j.html

書籍だったら、『プログラミング言語SCHEME』R.ケント ディヴィグ (著)
www.amazon.co.jp/exec/obidos/ASIN/4894712261


・英語

上の本の原書(英語版)がオンラインで読める。
www.scheme.com/tspl2d/index.html

77 名前:デフォルトの名無しさん mailto:sage [04/08/18 23:27]
>>76
よっぱど英語を見たくないのでもなければ、下の英語のがおすすめ。
わかりやすいよ。





78 名前:デフォルトの名無しさん mailto:sage [04/08/19 00:27]
Dr.Schemeって機能限定されてない?
defstructとか使えないような気がする・・・

79 名前:デフォルトの名無しさん mailto:sage [04/08/19 01:40]
「機能限定されてる」んじゃなくて、「機能拡張されてない」んでしょ
defstruct は srfi なんだから

80 名前:デフォルトの名無しさん [04/08/19 02:32]
The Little Schemer の9章を解説してるwebページはないですかね?
もしくは理解するのに役立つwebページ、本でもいいですが…。

define 使わなくても lambda をたくさん使えば関数定義できるってことを
解説した章だったんでしょうか?さぱーりわかりません。ヽ(´ー`)ノ



81 名前:デフォルトの名無しさん mailto:sage [04/08/19 06:26]
lambdaで関数定義ってことはY combinatorかなあ。

82 名前:デフォルトの名無しさん [04/08/19 08:46]
昨日の某大学の院試でSchemeの問題が出たんだけど…

できませんでした。orz

83 名前:デフォルトの名無しさん mailto:sage [04/08/19 10:29]
>>80
あれは Y Combinator の説明なんだけど、はっきり言ってわかりづらい。
私は旧版の日本語訳『Scheme手習い』しか読んでないんだけど。

ちなみに Y Combinator とは、lambda だけで定義された再帰関数をつくる
ための汎用関数。

とりあえずこんなページをどうぞ。
i.loveruby.net/ja/misc/ycombinator.html

あと、このスレの Part 9 の 422 から、lambda だけで再帰する方法に
ついて議論がある。個人的にはそこがとても参考になった。
そこを見ながら、自分でいろいろコードを書いてみて、Y Combinator が
なぜこういう形でなければならないのか、納得できるまで追及した。

84 名前:デフォルトの名無しさん mailto:sage [04/08/19 12:44]
>>82
ツバメの大学ですか?
いや,まあ俺も(ry

85 名前:デフォルトの名無しさん mailto:sage [04/08/19 16:13]
>>80 この説明はどうですか?
otoha.dyndns.org/diary/0408.html#19

86 名前:デフォルトの名無しさん mailto:sage [04/08/19 23:34]
(sort lst #'< :key #'car)

で先頭に来るやつが,元の lst の中でどこにあったのか (position) を
知るにはどうしたらいいんでしょう?

(position-if #'この中で一番大きい lst)
みたいなことをやりたいのです.

87 名前:デフォルトの名無しさん mailto:sage [04/08/19 23:44]
>>86
効率悪いけど、こんな感じじゃダメですか。
(let ((x '(1 2 3 4)))
(position (apply #'max x) x))




88 名前:86 mailto:sage [04/08/19 23:53]
>>87
ダメじゃないです.ただ,良く使われそうな操作なので,
みなさんなら最も短くて効率の良い方法をご存じかと思ったんです.

max が返すものは,元の要素と eq なんですよね.

89 名前:デフォルトの名無しさん mailto:sage [04/08/20 00:31]
(define (hoge x)
(let loop ((max (car x)) (mnum 0) (x (cdr x)) (num 1))
(cond ((null? x) mnum)
((> (car x) max) (loop (car x) num (cdr x) (+ num 1)))
(else (loop max mnum (cdr x) (+ num 1))))))

90 名前:デフォルトの名無しさん mailto:sage [04/08/20 00:44]
Schemeですまんが、結局こうするしかないのでは。

(define (position-if pred lis)
  (if (null? lis)
      -1
      (let loop ((pos 1) (ans-pos 0) (ans-val (car lis)) (lis (cdr lis)))
        (if (null? lis)
            ans-pos
            (if (pred (car lis) ans-val)
                (loop (+ 1 pos) pos (car lis) (cdr lis))
                (loop (+ 1 pos) ans-pos ans-val (cdr lis)))))))

(position-if < '(2 9 3 1 4)) => 3
(position-if > '(2 9 3 1 4)) => 1
(position-if < '()) => -1


91 名前:90 mailto:sage [04/08/20 00:48]
10分以上遅れて結婚とは…orz

92 名前:デフォルトの名無しさん [04/08/20 02:21]
マスターするならCommonLispとSchemeどっちがいい?

93 名前:デフォルトの名無しさん mailto:sage [04/08/20 02:34]
どっちも趣味

94 名前:デフォルトの名無しさん mailto:sage [04/08/20 06:53]
>>93
どっちも優雅で知的で、極めるまでは時間が
かかるけど学ぶことそのものが楽しみつつ行
なえる素晴しい言語って意味?

それともどっちも金にならないオタク言語で
ちょっとした満足感は得られるけど世間では
何の評価も得られなくて非生産的って意味?


95 名前:デフォルトの名無しさん [04/08/20 10:29]
Lisp の実装によくある、car 部のお隣(物理的な隣のメモリ)に
直接 cdr 部を置くことで、(car . cdr) を4+4 = 8バイトで表す技法が理解できません。

確か Guile の中の人に、それの説明らしき文書があったような気がするけど、
今、Guile が手元にないのと、そもそも英語が碌に読めません。

どうしてこんなのでちゃんと動くんですか?
誰か詳しい人教えてください。


96 名前:デフォルトの名無しさん mailto:sage [04/08/20 11:16]
>>95
アドレスのLSBから数ビットをタグに使う

97 名前:95 mailto:sage [04/08/20 11:39]
いや、タグの話ではなくて。。。

例えば、 単純な (1 . 2) というペアだけならば話は分かるが、
(1 2. 3) となった場合とか、((1 .2) 3 4 . 5) となった場合とか、
どうして >>95 で良いのかが分からん。




98 名前:デフォルトの名無しさん mailto:sage [04/08/20 11:50]
どこがダメになりそうだと思うのですか?

99 名前:95 mailto:sage [04/08/20 12:30]
例えば、ヒープを8バイト(セル2つ分)単位で確保して、

#define CAR(a) (*(a))
#define CDR(a) (*((a)|4))
みたいなマクロが定義されている場合、

仮に
car 部がアドレス 0x12345670 に配置されて、
cdr 部がアドレス 0x12345674 に配置されるとして、

その cdr の cdr はどうするのさ?とか、
(#define CDR(a) (*((a)+4)) なら、まだ納得できるけど・・・)

つか、上のような8バイト単位でメモリを切り取っていく
意味が良く分かっていないと思う(メモリの圧縮(=節約)の為
だという事ぐらいは分かるのだが)。


100 名前:デフォルトの名無しさん mailto:sage [04/08/20 12:33]
4バイトがセルへのポインタになったり即値になったりする様子がイメージできないのでは?

101 名前:デフォルトの名無しさん mailto:sage [04/08/20 12:48]
>>96
>>99の例でいうと, car部は 0x5670**** へのポインタとみなされて
cdr部は0x5674**** へのポインタとみなされるってことでいい?

>>100
即値の場合も即値へのポインタじゃないの?

102 名前:デフォルトの名無しさん mailto:sage [04/08/20 12:55]
即値は即値ですよ。ふつうヒープ上に配置したりはしません。

103 名前:デフォルトの名無しさん mailto:sage [04/08/20 13:01]
えーと、いわゆるcdr codingの話じゃなくて、consセルを
ポインタ2つ分きっかりで表す話をしてるんだよねぇ?
それならどこがどうわからないのかわからないんだけど。
基本はcarもcdrもポインタでそ。

テクニックとしてめんどいのは、ポインタが指しているものが
consセルなのかそれ以外のオブジェクトなのかの区別だけど、
それはconsセル以外のヒープアロケートオブジェクトの最初の
ワードに即値でもポインタでもないようなタグを持つマークを置いて
おけば、区別できる。

(ここで言う即値は、例えば30bit integerを2bitシフトして
下位2bitを01にしてポインタと区別する、というようなやつの
ことね >>101 )



104 名前:デフォルトの名無しさん mailto:sage [04/08/20 13:03]
CONSセルの値って全てがポインタだと思っていた。
即値が入ってる場合があるの?

www.shiro.dreamhost.com/scheme/trans/icad-j.html
> # 動的型付け。Lispでは全ての変数は実質的にポインタだ。変数ではなく
> 値の方に型が付いており、代入や束縛は実質的にポインタのコピーで行われ、
> ポインタが指されるものには作用しない。

105 名前:104 mailto:sage [04/08/20 13:07]
おや、すでに解答が>>103に書かれていた。
リロードすればよかった。スマソ。

106 名前:95 mailto:sage [04/08/20 13:42]
>>100
>4バイトがセルへのポインタになったり即値になったりする様子がイメージできないのでは?

ん〜、そこら辺は分かっていると思うんだけど。。。

>>103
>consセルをポインタ2つ分きっかりで表す話をしてるんだよねぇ?
>それならどこがどうわからないのかわからないんだけど。

>>99 の例で言えば
cons + car であるアドレス 0x12345670 の cdr が
アドレス 0x12345674 なのは分かるけど、
アドレス 0x12345674 の cdr はどうなってるの?って事。

アドレス 0x12345678 になるならば話は分かるけど、
そうではなさそうだし・・・


107 名前:デフォルトの名無しさん mailto:sage [04/08/20 13:44]
Cのポインタの理解ができていないだけのような気がしないでもない。



108 名前:95 mailto:sage [04/08/20 14:06]
>>107
そうなの?

それとついでに、セルを確保する際に、
必ず8バイト(セル2つ分)単位で
メモリを切り取っていくという点も。


109 名前:デフォルトの名無しさん mailto:sage [04/08/20 14:10]
>>95
ど素人っぽいけど
その辺の話題は過去スレで散々がいしゅつだから、
過去ログさらっと流し読みしてみれば?
幸い全部残ってるし。

110 名前:デフォルトの名無しさん mailto:sage [04/08/20 14:13]
>>106

>アドレス 0x12345678 になるならば話は分かるけど、
なるよ。

そのポインタが下位2ビットは使ってないことわかる?
例えばその2ビットをフラグとみなして識別に使ったりする。

111 名前:デフォルトの名無しさん mailto:sage [04/08/20 14:15]
>>106
あーそうか、ポインタまるで理解してないね。
そういう事知ろうとする前に、C言語でもやったら?

112 名前:デフォルトの名無しさん mailto:sage [04/08/20 14:19]
そもそもこの場合、0x12345674 は cons cell を表わす値としてありえないだろう。
cons cell が 8バイトアラインメントなんだから。
ありえない値の cdr なんて取れるはずがない。

113 名前:95 mailto:sage [04/08/20 14:20]
>>110
>なるよ。

#define CDR(a) (*((a)|4))

ここで + 演算ではなく | 演算をしているでしょ?
それではどうやってもならないと思うし、
また >>108 の回答にもなっていない。


114 名前:名無しさん@Emacs mailto:sage [04/08/20 14:36]
8バイトで align されてるってことは
 a % 8 == 0
ってことだ。
この場合は 0<=i<7 の i に対して、a+i == a|i が成り立つ。
だから + でも | でもよい。


115 名前:デフォルトの名無しさん mailto:sage [04/08/20 14:42]
もしかして (1 2 . 3) が

0x12345670 1
0x12345674 2
0x12345678 3

みたいに配置されると思ってるのかな。

0x12345670 1
0x12345674 cons 0x12345678

0x12345678 2
0x1234567c 3

だよ。 cdr-coding だと話は別だけど、今時 cdr-coding なんてやらないし。

116 名前:デフォルトの名無しさん mailto:sage [04/08/20 14:45]
long一発で初期化できるというヨロコビはあるかも。通常の2倍の速さでコンパクションできるとか。
(コンパクションの必要があるかどうかは知らんけど)

117 名前:95 mailto:sage [04/08/20 15:18]
>>115
>0x12345670 1
>0x12345674 cons 0x12345678
>
>0x12345678 2
>0x1234567c 3
>
>だよ。

あ、なるほど。それで分かりました。
でもそれでは余り8バイト単位で確保する意味が無いですね。
逆にメモリを使いそう・・・

ところで、cdr-coding ってなんですか?




118 名前:デフォルトの名無しさん mailto:sage [04/08/20 15:22]
>>117
>でもそれでは余り8バイト単位で確保する意味が無いですね。

でも高速化の為なら意味があるか。
それだけ為なのかなぁ?


119 名前:デフォルトの名無しさん mailto:sage [04/08/20 15:35]
何バイト単位が最適だと思ってるの?

120 名前:95 mailto:sage [04/08/20 15:41]
>>119
4バイト


121 名前:デフォルトの名無しさん mailto:sage [04/08/20 17:21]
ポインタに4バイト使うなら、consセルは8ビットいるよ。

122 名前:デフォルトの名無しさん mailto:sage [04/08/20 17:22]
8ビットじゃなかった。8バイトだ。

123 名前:デフォルトの名無しさん mailto:sage [04/08/20 17:27]
>>120
…まあ落ち着け。
cons セルはバイナリ・ツリー(二分木)のノード(節)だ。
一つの節から生える枝は必ずcar, cdr の 2本だから、
一つの cons セルは2本分の枝のアドレスを保持する必要があるんだよ。
だから 4バイト × 2 で8バイトが必要になる。

124 名前:デフォルトの名無しさん mailto:sage [04/08/20 17:35]
>>120
あとな、この辺の図も見ておけ。
cons セルがどうしてポインタを2つ持つのか、いやおう無しに分かるから。
www.stdio.h.kyoto-u.ac.jp/~hioki/gairon-enshuu/SchemeNotes/listproc.html


125 名前:デフォルトの名無しさん mailto:sage [04/08/20 17:56]
>>117
それをみんなずっと言ってたんじゃないかあぁぁぁぁ・・ぁぁぁぁ・・・・・・


126 名前:デフォルトの名無しさん mailto:sage [04/08/20 18:05]
単にconsセルを理解してないだけだろ。

127 名前:95 mailto:sage [04/08/20 18:59]
いや、どうも。。。

結局のところ cons セルを "ナイーブに" 実装するだけだったら
ポインタを2つ積めば良いのは分かっているんだけど、
確か世の中には、それをもう少し圧縮する技法が
あったと思ってたので。

例えば >>115 のように、cdr となるセルを
(物理的に)隣のメモリに配置することが出来て、
それを cons 表現の(内部的に)特殊な表現として扱えれば、
本来であれば (car . cdr) を表現するためには
3つのセルを使用しなければならないところを、
たった2つのセルで表現できてしまう。
ていうか、セル1つの表現が4バイトあればほぼ事足りてしまう。
(勿論再帰などの問題があるので、通常のポインタ2つ丸々
使用する例外的な表現も許すようにしておけばよい)
Lisp で使うセルの大半は cons なので、
こういうのは結構お得な発想だと思っていたけど?




128 名前:デフォルトの名無しさん mailto:sage [04/08/20 19:06]
>>127 それをcdr-codingっていうんだよ。
www-2.cs.cmu.edu/Groups/AI/html/faqs/lang/lisp/part2/faq-doc-9.html



129 名前:デフォルトの名無しさん mailto:sage [04/08/20 19:16]
>結局のところ cons セルを "ナイーブに" 実装するだけだったら
>ポインタを2つ積めば良いのは分かっているんだけど、
>確か世の中には、それをもう少し圧縮する技法が
>あったと思ってたので。
そういうことは最初から書いとけよ。
理由付けもなく4バイトとか言われても、理解してないとしか思えないんだよ。






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

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

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