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


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

Lisp Scheme Part19



1 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:14:56 ]
過去スレ
Part18: ttp://pc11.2ch.net/test/read.cgi/tech/1186922295/
Part17: ttp://pc11.2ch.net/test/read.cgi/tech/1177065699/
Part16: ttp://pc11.2ch.net/test/read.cgi/tech/1172404795/
Part15: ttp://pc10.2ch.net/test/read.cgi/tech/1151025773/
Part14: ttp://pc8.2ch.net/test/read.cgi/tech/1132275726/
Part13: ttp://pc8.2ch.net/test/read.cgi/tech/1115901841/
Part12: ttp://pc8.2ch.net/test/read.cgi/tech/1100229366/
Part11: ttp://pc5.2ch.net/test/read.cgi/tech/1091456033/
Part10: ttp://pc5.2ch.net/test/read.cgi/tech/1075630259/
Part9: ttp://pc2.2ch.net/test/read.cgi/tech/1069594582/
Part8: ttp://pc5.2ch.net/tech/kako/1058/10582/1058263391.html
Part7: ttp://pc5.2ch.net/tech/kako/1042/10421/1042167213.html
Part6: ttp://pc3.2ch.net/tech/kako/1031/10315/1031560687.html
Part5: ttp://pc3.2ch.net/tech/kako/1023/10230/1023091882.html
Part4: ttp://pc.2ch.net/tech/kako/1016/10162/1016211619.html
Part3: ttp://pc.2ch.net/tech/kako/1008/10082/1008220265.html
Part2: ttp://pc.2ch.net/tech/kako/1002/10025/1002584344.html
Part1: ttp://piza2.2ch.net/tech/kako/987/987169286.html

266 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 17:27:52 ]
>>264

8章は良いですね。

book.mycom.co.jp/book/4-8399-2081-8/4-8399-2081-8.shtml
わかっていて買う人は良いですけど。
タイトル買いをしてCommon Lispの入門に使えないのは残念だと思います。

プログラムをCommon Lispで動くかどうかも試してないみたいですし。


267 名前:264 mailto:sage [2008/01/24(木) 17:42:27 ]
>>265
>>266

なるほど〜、そうなんだ。

FXはちょっとだな...プロにかもられなきゃいいけど。

268 名前:264 mailto:sage [2008/01/24(木) 22:03:16 ]
でも、本はなかなか良いと思う。
黄金比の固有値、固有ベクトルなんかにも触れていたり。
数学へのモチベーションも上がるし高校生なんかにはいいんじゃないかね。

269 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 22:20:40 ]
本人自演乙

270 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:28:11 ]
>>268
> 黄金比の固有値、固有ベクトルなんかにも触れていたり。
で, どのあたりが
> 数学へのモチベーション
につながるのかな?


271 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 01:15:13 ]
入門の入門には悪くないと思う
自分はλ計算についてこの本で知った
そしてすぐに高橋正子の計算論、グレアムのAnsi Common Lisp、ディヴィグのプログラミング言語Schemeを買ってどっぷりはまったクチ
でも「代入文は使わない」のところで(Cの)初期化と代入を混同してるような文章がある等
あちこち気になる点があるのも事実
それに高校生の「数学への」モチベーションにはならないと思う

だけどLispやλ計算を知るきっかけになってくれたことには感謝してる
(λ記法は知ってたけどλ算法は知らなかった)


272 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 01:16:53 ]
入計算λ門

ぱっと見わからないなw
ごめんなさい

273 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 01:28:58 ]
数学もプログラミングもほとんど素地なくても(←念のため俺のこと)
あの入門本から計算論ていけるもんですか?

274 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 01:33:24 ]
君の素地次第だからなんとも言えない



275 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 01:45:57 ]
じゃあ逆に、、どんな素地の人がそんなに一気にはまったのですか?

276 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 01:55:49 ]
それは逆になっていませんよ

277 名前:271-272 mailto:sage [2008/01/25(金) 02:02:46 ]
274は271じゃないけど
自分は素地というよりλ計算の美しさに魅せられたからだと思ってる

278 名前:271-272 mailto:sage [2008/01/25(金) 02:09:56 ]
あ、それから計算論はまだ読破できてません
自分の素地といえば
・車輪の再発明が大好き
・Smalltalkに惚れた
・MIPSのアーキテクチャに惚れた
・Windows、32bitのx86を毛嫌いしている
・今はSchemeに夢中
・でも一番美しいのはλ式だと思ってる

「美しいものを嫌いな人がいるのかしら?」ってとこかなw

279 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 02:10:00 ]
ディヴィグ本買いそびれてオジサン涙目 orz

280 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 02:15:28 ]
美しいものを嫌いな人はあまりいないだろうが美的センスは個々によってだいぶ違うだろうな

281 名前:271-272 mailto:sage [2008/01/25(金) 02:25:15 ]
そうですね
λ式よりもコンビネータ理論のほうが美しいと言う人もいますしね

282 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 03:05:23 ]
多少不細工でも料理の上手い子のほうがいいよ

283 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 04:07:48 ]
Perlか。>不細工だけど料理は出来る

284 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 05:13:37 ]
>>270

大学1年で線形代数をみっちりやるじゃない。
後期で固有値、固有ベクトルをやったんだけどその応用のひとつ。
フィボナッチ数列が行列の積として表せて固有値を計算すると黄金比
がでてくるなんてすごいじゃんと思った。
萩谷先生の「関数プログラミング」にもそういう題材があったと思う。
本はどこに片付けたかわからなくて確かめられないけど、たしか
あったと思う。

高校でやる行列やベクトルが実はとても面白い分野と将来結びついてくる
ということを知ればもっともっと数学が楽しくなると思う。




285 名前:275 mailto:sage [2008/01/25(金) 08:35:20 ]
サンキューララァ。なんとなくだけどわかりました。

286 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 13:25:08 ]
固有値に黄金比が出てくるのは大学受験の時知ったけど…

287 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 15:50:30 ]
高校生の時、勉強さぼってたんでよくわからないけど、
優秀な人は高校の時に固有値、固有ベクトルに慣れ親しんでるらしいね。
萩谷先生の本だったかエッセーだったかに「高校時代に慣れ親しんだ...」みたいな
話があったと思う。



288 名前:286 mailto:sage [2008/01/25(金) 19:31:03 ]
固有値やったのは俺が旧課程だからかもしれないな。
だって優秀じゃないし(^_^;)

289 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 19:42:59 ]
CやC++で窓のGUI書くのとLISPで書くのどっちがお手軽かな・・・

290 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 20:05:52 ]
最近はC#が楽すぎワロタっていう感じ。

291 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 20:46:10 ]
やっぱKawaでしょ

292 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 22:44:59 ]
>>278
Lisp系だと「原理主義」にどう対応するかで派閥があるからなぁ。


293 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 23:50:56 ]
>>278
単なる茶々だけど
> ・MIPSのアーキテクチャに惚れた

NIPS 32bit: シンプルでかわぇぇ!!!
MIPS 64bit: バッチィ… 特にアドレス空間周りがorz

消防とか厨房とかの頃, 好きだった女の子に同窓会でであったら… … …
てな, 心境だったな > MIPS 64bit


294 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 23:52:33 ]
>>279
> ディヴィグ本買いそびれてオジサン涙目 orz

げええっ、絶版かよ!俺もまだ買ってないのに!
www.amazon.co.jp/dp/4894712261
> 現在在庫切れです。この商品の再入荷予定は立っておりません。




295 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 00:24:54 ]
>>293
激しく同意です
R3000はイカスけどR4000はイケてない
遅延スロット使ってストールなしに分岐できるのがクールなのに
といいつつ一番弄ったMIPSはEmotionEngine(^^;)

>>294
某大手書店の最後の一冊買っちゃった
日本語版の初版第2刷
オライリーさん、>>209の日本語版よろしくです

296 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 00:46:07 ]
>>294
これって名著なの?
俺買ったけど面白くなかったからSICP買って今それ読んでる。
SICP読み終わってからこれ読んだらわかるようになってるかな?

297 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 00:49:36 ]
別に名著じゃないと思うけど
グレアムのAnsi Common Lisp/On Lispの方がずっといい
けどSchemeは本が少ないから

自分が持ってるのはディヴィグ本の日本語版、SICPの日本語版、Schemeによる記号処理入門

298 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 00:53:24 ]
本が少ないってのは日本語の本のことね

299 名前:sage [2008/01/26(土) 07:53:15 ]
いま、とんでもないことに気がついたんだが ...
LISP は LISP で アトム を定義することができない
そんな、気がするんだが気のせいか?

300 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 09:12:44 ]
>>299
atom は pure lisp の5関数(CAR、CDR、CONS、ATOM、EQ)に含まれているんだからそらそうでしょ

301 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 10:29:10 ]
Lisp作るのにyaccは不要だがlexに匹敵する強力なリードマクロがあってもいいはず

302 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 12:35:10 ]
>>266
>プログラムをCommon Lispで動くかどうかも試してないみたいですし。

本のサポートページにソースがあったのでちょっとだけ試してみた。
ttp://book.mycom.co.jp/support/e2/lisp/

8章のコードはGCLならOKだったよ。SBCLだとひっかったのがあったけど。
CLだとfuncallとか1+をquoteしなきゃならないとか気持ち悪いので
Schemeで書き直そうかと思っている。

303 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 13:07:21 ]
λ計算はβ変換で簡約していくのに対して
Lisp、Schemeは都度実際に計算していくので
λとは違うみたいだね。

Lispでλ式をλ計算どおりに簡約化していくものを作ったら面白いかも。

304 名前:303 mailto:sage [2008/01/26(土) 13:12:05 ]
ああ、萩谷先生、もうとっくにそういうの作ってるね。
ttp://hagi.is.s.u-tokyo.ac.jp/boomborg/boomborg-red-j.html



305 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 15:50:38 ]
>>303
いかにしてα変換をサボるかが重要なわけだが

((lambda (x) (lambda (y) x)) y) => (lambda (foo) y)

306 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 16:15:30 ]
やたー!
OpenBSDザウルスでGaucheが動かせるようになったー!
pdaXromやtitchyやPocketWorkstationに浮気する必要がなくなったー!

307 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 18:05:38 ]
>>303
その辺りは昔、関数型言語の遅延評価の実装で良く議論されました。
古いけど全文公開されている↓の「第二部 グラフ簡約」など。
research.microsoft.com/~simonpj/papers/slpj-book-1987/slpj-book-1987.pdf

308 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 20:45:52 ]
>>305
>>307

面白くなってきたので今晩、Schemeでλ計算インタープリタを書いてみるよ。


309 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 22:34:06 ]
;;λ計算インタープリタ

(define (subst old new f)
(cond ((null? f) '())
((equal? (car f) old) (cons new (subst old new (cdr f))))
((atom? (car f)) (cons (car f) (subst old new (cdr f))))
(else (cons (subst old new (car f))(subst old new (cdr f))))))

(define (lambda? f)
(and (list? f) (eq? (car f) 'lambda)))

(define (atom? f)
(and (not (pair? f))))


(define (beta-redix? f)
(and (lambda? (car f))
(not (null? (cdr f)))))


310 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 22:34:45 ]
(define (beta-conversion l m)
(let ((arg (caadr l))
(body (cddr l)))
(subst arg m body)))

;; (((lambda (x) ...) M)) -> ((lambda (x) ...) M)
(define (deep-lambda? f)
(cond ((lambda? f) #f)
((atom? (car f)) #f)
((and (list? (caar f)) (eq? (caaar f) 'lambda)) #t)
(else #f)))

(define (reduction form)
(cond ((deep-lambda? form) (reduction (car form)))
((not (beta-redix? form)) form)
(else (begin (display form)(newline)
(reduction (beta-conversion (car form) (cadr form)))))))

(define foo '((lambda (x) x) (lambda (a) a)))
(define bar '((lambda (y) y ((lambda (z) x z) (lambda (z) z))) (lambda (a) a)))


311 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 22:37:43 ]
> (reduction bar)
((lambda (y) y ((lambda (z) x z) (lambda (z) z))) (lambda (a) a))
((lambda (a) a) ((lambda (z) x z) (lambda (z) z)))
((lambda (z) x z) (lambda (z) z))
(x (lambda (z) z))

新納先生のp157をやってみて同じ結果になったつもりなんだけど...
こんなんでいいのだろうか?
β変換しか考えていない。α変換は無視している。

312 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 22:44:47 ]
一瞬意味判らんかったけど、x yの場合(x y)の意味か。
まあ副作用無視なら単純だよ。

313 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 23:29:18 ]
λx.(NM)はλx.NM と略記して良いと書いてあったので。

正直、まだよく理解できていない。こういうことをやることがλ計算と
言われるものなのだろうか???

314 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 23:40:32 ]
> (reduction '((lambda (x) x) y))
((lambda (x) x) y)
(y)

これは(null? (cdr f))とかすればいいとして

> (reduction '(x ((lambda (x) x) y)))
(x ((lambda (x) x) y))

こっちが面倒だな



315 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 07:27:52 ]
>>314

あ、そっか。なるほど〜。
考えてみる。λ計算ってのはなかなか面白いね。

かんばってチャーチ、ロッサーの定理にも挑戦してみたい。

316 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 08:35:22 ]
;;λ計算インタープリタ ver0.2

(define (subst old new f)
(cond ((null? f) '())
((equal? (car f) old) (cons new (subst old new (cdr f))))
((atom? (car f)) (cons (car f) (subst old new (cdr f))))
(else (cons (subst old new (car f))(subst old new (cdr f))))))

(define (lambda? f)
(and (list? f) (eq? (car f) 'lambda)))

(define (atom? f)
(and (not (pair? f))))


(define (beta-redix? f)
(cond ((atom? f) #f)
((and (atom? (car f)) (null? (cdr f))) #f)
((and (lambda? (car f))(not (null? (cdr f)))) #t)
((lambda? (caadr f)) #t)
(else #f)))


317 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 08:36:45 ]
(define (left-lambda? f)
(and (lambda? (car f))(not (null? (cdr f)))))

(define (right-lambda? f)
(lambda? (caadr f)))

(define (beta-conversion l m)
(let ((arg (caadr l))
(body (cddr l)))
(subst arg m body)))


(define (deep-lambda? f)
(cond ((lambda? f) #f)
((atom? (car f)) #f)
((and (list? (caar f)) (eq? (caaar f) 'lambda)) #t)
(else #f)))

(define (var? f)
(and (atom? (car f)) (null? (cdr f))))

(define (deep-lambda2? f)
(and (lambda? (car f)) (null? (cdr f))))



318 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 08:37:34 ]
;; (((lambda (x) ...) M)) -> ((lambda (x) ...) M)
;; (x) -> x
;; ((lambda (a) a)) -> (lambda (a) a)
(define (simpl f)
(cond ((atom? f) f)
((deep-lambda? f) (car f))
((deep-lambda2? f) (car f))
((var? f) (car f))
(else f)))

(define (reduction form)
(cond ((not (beta-redix? form)) form)
((left-lambda? form)
(begin (display form)(newline)
(reduction (simpl (beta-conversion (car form) (cadr form))))))
((right-lambda? form)
(begin (display form)(newline)
(reduction (simpl (beta-conversion (caadr form) (cadr (cadr form)))))))))

(define foo '((lambda (x) x) (lambda (a) a)))
(define bar '((lambda (y) y ((lambda (z) x z) (lambda (z) z))) (lambda (a) a)))
(define baz '(x ((lambda (x) x) y)))
(define boo '((lambda (x) x) y))


319 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 08:39:33 ]
> (reduction foo)
((lambda (x) x) (lambda (a) a))
(lambda (a) a)
> (reduction bar)
((lambda (y) y ((lambda (z) x z) (lambda (z) z))) (lambda (a) a))
((lambda (a) a) ((lambda (z) x z) (lambda (z) z)))
((lambda (z) x z) (lambda (z) z))
(x (lambda (z) z))
> (reduction baz)
(x ((lambda (x) x) y))
y
> (reduction boo)
((lambda (x) x) y)
y
>

こんどはいいかな?

320 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 09:02:39 ]
(define uoo '((lambda (x) (lambda (y) x)) y))

> (reduction uoo)
((lambda (x) (lambda (y) x)) y)
(lambda (y) y)
>

これがダメなんだけどα変換がよくわからない。
高橋正子先生の本にもα変換がないみたい。

321 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 09:42:50 ]
違っていた。修正
(define (beta-redix? f)
(cond ((atom? f) #f)
((and (atom? (car f)) (atom? (cadr f))) #f)
((and (atom? (car f)) (null? (cdr f))) #f)
((and (lambda? (car f))(not (null? (cdr f)))) #t)
((lambda? (caadr f)) #t)
(else #f)))

(define (reduction form)
(cond ((not (beta-redix? form)) form)
((left-lambda? form)
(begin (display form)(newline)
(reduction (simpl (beta-conversion (car form) (cadr form))))))
((right-lambda? form)
(begin (display form)(newline)
(reduction (list (car form)
(simpl (beta-conversion (caadr form) (cadr (cadr form))))))))))

> (reduction baz)
(x ((lambda (x) x) y))
(x y)

322 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:13:47 ]
>>306 激しく乙

つ旦

323 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 19:17:30 ]
>>322
ども
だけどGC周りがまだ怪しいから手をくわえなきゃいけない

324 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 21:14:25 ]
tcc.nifty.com/cs/catalog/tcc_schedule/catalog_080118183253_1.htm

gauche.night前売りktkr。今年は黒田さん出ないの?




325 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 23:02:15 ]
>>324
黒黒田でないんじゃつまらんなぁ

326 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 23:14:26 ]
>>320
λ式をリストで表現してると、名前の衝突回避は難しいような

327 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 23:35:04 ]
>>326

> uoo2
((lambda (x) (lambda (z) x)) y)
> (reduce uoo2)
((lambda (x) (lambda (z) x)) y)
(lambda (z) y)
>

束縛変数の付け替えをすればうまくいくはずで、そのことを
α変換というのだと思う。で、このα変換をどのようにアルゴリズム
として表現できるのかと考えている。

新納先生のp156のβ変換の説明の最初にあるアンダーラインの部分が
α変換のことだと思う。

コンパイラ設計者には必須の知識らしいんだけどさっぱりわからない。

328 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 23:38:22 ]
チャーチ符号化はこんなことなのだと思う。
> two
((lambda (x) (lambda (s) (s (s x)))) 0)
> (reduce two)
((lambda (x) (lambda (s) (s (s x)))) 0)
(lambda (s) (s (s 0)))
> ((lambda (s) (s (s 0))) 1+)
2
>

SICPの1章にもあったような気もするけど忘却の彼方。

329 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 23:47:46 ]
openmclがClozure CLに改名したね。

330 名前:326 mailto:sage [2008/01/27(日) 23:58:13 ]
>>327
ああそうか、ちょっと勘違いしてたみたいだ。
(lambda ...) に代入するときに名前を変えてやればいいんだから、
そんなに難しくはないね。

331 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 00:05:11 ]
>>327
住井先生の速攻MinCamlコンパイラ概説のAlpha.mlが読めればそれを参考にするといいかも.
ttp://min-caml.sourceforge.net/
MinCamlではλ式でなくlet recのところでローカル関数を定義するけどね.

構文木を上から調べていって,変数が導入されていたら
グローバルなカウンタか何かを使ってとにかく一意な名前に変えてしまう( x → x1, y → y2 etc. )
そしてハッシュでその対応を覚えておく.
ネストした変数束縛で同じ "x" が再び現れたら,
そこから下の部分木では対応は x → x1 でなく x → x3 (例えば)であるとハッシュを更新.

例.構文木のうち見終わった部分を [] で書くと...
(lambda (x) (lambda (y) (lambda (x) (list x y x))))
→ [lambda [x1] (lambda (y) (lambda (x) (list x y x)))] with {x → x1}
→ [lambda [x1] [lambda [y2] (lambda (x) (list x y x))]] with {x → x1, y → y2}
→ [lambda [x1] [lambda [y2] [lambda [x3] (list x y x)]]] with {x → x3, y → y2}
→ [lambda [x1] [lambda [y2] [lambda [x3] [list x3 y2 x3]]]] with {x → x3, y → y2}

332 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 01:35:10 ]
C#の匿名メソッドはクロージャーじゃないっていうけど、何で?
クロージャーの補足する環境にオブジェクトの値ではなく参照を含めるだけじゃダメなの?
scheme的にはどう?

333 名前:327 mailto:sage [2008/01/28(月) 08:30:39 ]
>>331

ありがとう。
やってみるよ。

334 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 10:26:25 ]
>>332
blogs.msdn.com/abhinaba/archive/2005/10/18/482180.aspx




335 名前:306=323 mailto:sage [2008/01/28(月) 17:16:03 ]
GaucheをOpenBSDザウルスでビルドできるようになったんだけど
45%程度の確率で*load-path*が破損している
55%: ("../test" "../lib" "../libsrc" "../src" ...)
45%: ("\f" "../lib" "../libsrc" "../src" ...)
みたいな感じ
-Iで与えられたディレクトリ名のみが破壊されてる
破壊されるパターンはランダムではなく、
いつも決まった文字列にすり替わってる
GC_DONT_GC=Yesすると0%になるからGC周りの問題なんだろうけど
どこが悪いのか見当もつかない
せめて同じ引数で起動したときには同じ状況になってくれればいいのに

336 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:03:08 ]
うへえ、追いにくそうなバグだね

337 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:36:35 ]
起動してから20分ぐらいして温まったら安定したりしてなw
そのザウルス大丈夫なんだろうな?

338 名前:306 mailto:sage [2008/01/28(月) 23:44:17 ]
これまでにわかったのは
・最初のプロンプトが出る前にGCが発動した場合にのみ破壊が起こってること
・プロンプトが出た後のGCによって破壊されることは(今のところ)ないこと
・同じカレントディレクトリに同じ環境変数に同じコマンドライン引数でgoshを起動しても
最初のプロンプトが出る前にGCが発動するのが1000回試行中440回程度あること
・-I引数をいくつも与えると"srfi-6"とか"srfi-2"とか意味のある文字列にすりかわったりする場合があること
・同じカレントディレクトリに同じ環境変数に同じコマンドライン引数で起動した場合
すりかわった後の文字列はいつも同じであること

これらの材料でアタリをつけられる人いませんか?

339 名前:306 mailto:sage [2008/01/28(月) 23:58:06 ]
温まったら安定するようになるって可能性より
稼働時間長すぎて不安定になってるって可能性のほうが高いかもw
セルフコンパイル&セルフデバッグ&SSH鯖だから

340 名前:306 mailto:sage [2008/01/29(火) 00:05:48 ]
あ、そういえばプログラムが暴走したり長時間走ってるプロセスがあると
プログラムを起動しようとしてもBad Addressで起動しなかったりするようになる
何度も何度もチャレンジすれば起動するけど
i386-OpenBSDならそういうことないんだけど
でもそういうハード的な原因ならもっとランダムに破壊されそうなものだけど
破壊される場合は必ず同じパターンに破壊されるからソフト側の問題だと思う
Boehm-GCの機種依存部分であるスタックの底とstatic領域の始点を得る関数は
破壊パターン正常パターンともに同じ値を返してます
Gauche本体に当てたパッチはDOUBLE_ARMENDIANを未定義にするってのだけだから
やはりBoehm-GCに当てたパッチのバグ臭い

341 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 01:11:53 ]
>機種依存部分
CPUのレジスタも?・・・考えるだけでも恐ろしい

342 名前:306 mailto:sage [2008/01/29(火) 01:30:37 ]
static領域の終点も同じ値を返すから
どうもレジスタの指す領域のマーク漏れ臭い
でもi386-OpenBSDでは問題ないし
Linuxザウルスではうまくいってる(らしい)から
もうBoehm-GC側では怪しいところはないんだけどなぁ


343 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 06:46:25 ]
α変換とβ変換を考え直した。
;;λ計算インタープリタ ver0.3

(define (subst old new f)
(cond ((null? f) '())
((equal? (car f) old) (cons new (subst old new (cdr f))))
((atom? (car f)) (cons (car f) (subst old new (cdr f))))
(else (cons (subst old new (car f))(subst old new (cdr f))))))

(define (atom? f)
(and (not (pair? f))))

;;λ式の判定 定義2.1.1(計算論)
(define (lambda-term? f)
(cond ((symbol? f) #t) ;x0,x1...
((number? f) #t) ;1,2,3..数もλ式ということにする。
((null? (cdr f)) #f) ;(M)
((and (eq? (car f) 'lambda)(symbol? (caadr f))(lambda-term? (caddr f))) #t);λx.M
((and (lambda-term? (car f))(lambda-term? (cadr f)))) ;(M N)
(else #f)))


344 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 06:47:41 ]
;;α変換 λ式の定義にしたがってパース。
(define (alfa-conversion f)
(genvar 'reset)
(reset-var)
(alfa-conversion1 f))

(define (alfa-conversion1 f)
(cond ((and (symbol? f)(bound? f)) (bound? f))
((and (symbol? f)(not(bound? f)) f))
((number? f) f)
((null? (cdr f)) (alfa-conversion1 (car f)))
((and (eq? (car f) 'lambda)(symbol? (caadr f)))
(let ((new (genvar 'gen)) (l '()))
(bound (caadr f) new)
(set! l (list 'lambda (list new) (alfa-conversion1 (caddr f))))
(reset-var)
l))
(else (list (alfa-conversion1 (car f))(alfa-conversion1 (cadr f))))))


;;変数リスト
;;((x . x1)(y . x2) ...)
(define var-assoc '())

(define (bound? v)
(let ((ans (assq v var-assoc)))
(if ans
(cdr ans)
#f)))





345 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 06:49:06 ]
(define (bound old new)
(set! var-assoc (cons (cons old new) var-assoc)))

(define (reset-var)
(set! var-assoc '()))


;; 変数を生成する
(define genvar
(let ((x -1))
(lambda (msg)
(cond ((eq? msg 'gen)
(begin (set! x (+ x 1))
(string->symbol (string-append "x" (number->string x)))))
((eq? msg 'reset)(set! x -1))))))


;;β基の判定 (λx.M)N 計算論p66
(define (beta-redex? f)
(cond ((atom? f) #f)
((atom? (car f)) #f)
((and (eq? (caar f) 'lambda)
(symbol? (caadar f))
(lambda-term? (caddar f))
(lambda-term? (cadr f))) #t)
(else #f)))



346 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 06:49:59 ]
;;β正規形 β-normal-form
(define (beta-normal-form? f)
(cond ((and (lambda-term? f)(symbol? f)) #t) ; x0
((and (lambda-term? f)(beta-redex? (cadr f))) #f) ;(x λx.M)
((and (lambda-term? f)(not (beta-redex? f))) #t)
(else #f)))

;;β変換
(define (beta-reduce l m)
(let ((arg (caadr l))
(body (cddr l)))
(subst arg m body)))


;; ((N M)) -> (N M)
;; (x0) -> x0
;; (N) -> N
(define (simpl f)
(cond ((lambda-term? f) f)
((and (lambda-term? (car f))(null? (cdr f))) (car f))
((and (lambda-term? (caar f))(lambda-term? (cadar f))) (car f))
(else f)))

(define (reduce form)
(reduce1 (alfa-conversion form)))


347 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 06:51:56 ]
(define (reduce1 form)
(cond ((beta-normal-form? form) form)
((beta-redex? form)
(begin (display form)(newline)
(reduce1 (simpl (beta-reduce (car form) (cadr form))))))
((beta-redex? (cadr form))
(begin (display form)(newline)
(reduce1 (list (car form)
(simpl (beta-reduce (car (cadr form)) (cadr (cadr form))))))))))

> uoo
((lambda (x) (lambda (y) x)) y)
> (reduce uoo)
((lambda (x0) (lambda (x1) x0)) y)
(lambda (x1) y)
>
長々とスマンです。

348 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 07:10:53 ]
GaucheのGCは保守GCだっけ?
しかもARM?バグバグの予感

349 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 07:15:28 ]
λの本体はやっぱりカッコでくくらないといけなかった。
> bar
((lambda (y) (y ((lambda (z) (x z)) (lambda (z) z))))
(lambda (a) a))
> (reduce bar)
((lambda (x0) (x0 ((lambda (x1) (x x1)) (lambda (x2) x2)))) (lambda (x3) x3))
((lambda (x3) x3) ((lambda (x1) (x x1)) (lambda (x2) x2)))
((lambda (x1) (x x1)) (lambda (x2) x2))
(x (lambda (x2) x2))
>

350 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 12:58:28 ]
>>342
BoehmってXScaleできちんとした実績あるのかなあ

351 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 15:24:15 ]
>>349
余分な括弧を許してsimplを使うのがまわりくどい。

括弧の代わりにXMLみたいなタグをイメージしてみたら?
タグは<variable><application><abstraction>の3種類とする。
余分なタグをつけると意味が変わってしまうから、
余分なタグのない状態を保つことになり、simplなんていらなくなる。


それ以前にβ正規形の定義がおかしい。
β基は一番上とcadr以外の場所にもあるから全部探さないと

352 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 17:17:23 ]
>>351
>β基は一番上とcadr以外の場所にもあるから全部探さないと

具体的にどういう場合なのか教えてくれないか。考えてみたいんで。

353 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 17:59:52 ]
>>352
バックトラッキングみたいなことかな?

354 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 19:01:44 ]
λx.λy.x((λz.z)y)とかかな?



355 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 19:05:57 ]
>>352
最外簡約とかでググって。
>>307の本にも詳しく解説してある。

356 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 19:07:15 ]
正規形もいれた方がいいかな。

357 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 19:39:46 ]
>>351

言わんとすることがなんとなくわかってきた。
朝、早起きできたら書き直してみるよ。

358 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:06:50 ]
インデックス・オートマトン

359 名前:306 mailto:sage [2008/01/30(水) 06:37:02 ]
原因の一端が突き止められました
グローバル変数pre_cmdsがDATASTARTとDATAENDの間に位置してないから
スキャンの対象外になってたせいのようです
DATASTARTとDATAENDを正しく取得できるようにすればいいようです

360 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 07:25:09 ]
Arc arclanguage.org/ リリースされたぞ!

361 名前:306 mailto:sage [2008/01/30(水) 07:26:45 ]
Boehm-GCは.bssセクションの末尾からメモリを走査していって
最初にsegvったところ(の1ワード手前)が.rodataセクションの開始点だと仮定してるようですが
arm-OpenBSDはセクションの間ごとにsegvるので
.bssセクションのみをスキャン対象にしてしまうようです
OpenBSD4.2のportsのパッチはそこらへんを工夫してうまくやってるようです

362 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 07:42:51 ]
おつかれ〜

363 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 09:46:18 ]
>>306さんは凄いなぁ。


364 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 20:09:53 ]
>>360 よくわからんがすばらしい!



365 名前:306 mailto:sage [2008/01/30(水) 20:50:26 ]
C言語の範疇ではrodataセクションに
ヒープへのポインタは入り得ないので
dataセクションとbssセクションをスキャンするようにパッチを当て
test/system.scmのcond-expandのsigwait節にelse節を追加したら(pthreadを無効にしているため)
すべてのtestにpassしました
shiroさんのとこに報告しようと思います

C++とかだとコンストラクタの関係で
rodataセクションにもヒープへのポインタが入り得るのかな?

366 名前:デフォルトの名無しさん mailto:age [2008/01/30(水) 21:41:49 ]
>>306
Arcに期待してもいのかなあ?(期待したいのだけど)
「MzScheme上で動く」って言われても、
それを望んでいたのかなあ?
ソースも何も読んでないけど(「なら何も言うな!」はご勘弁を)
Paul Graham の名前で出てくるのだから
単にLISP処理系の一つではなく
「LISPもSchemeもまとめて、S式はArcに集まれ!」
ぐらいものを期待していたんだけど。

Arcをよく知ってる人!
解説よろしく!






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

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

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