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 あたり
610 名前:デフォルトの名無しさん mailto:sage [2005/07/23(土) 01:58:59 ] (define (pow2 x n) (apply * (vector->list (make-vector n x))))
611 名前:デフォルトの名無しさん mailto:sage [2005/07/23(土) 02:10:26 ] >>608 >>589 をそのまま実装すると (define (pow2 x n) (if (= n 0) 1 (let ((x1 (pow2 x (quotient n 2)))) (* x1 x1 (if (even? n) 1 x))))) x^n * x^n = (x * x)^n だから (define (pow2 x n) (if (= n 0) 1 (* (pow2 (* x x) (quotient n 2)) (if (even? n) 1 x)))) 末尾再帰に変換して >>607
612 名前:デフォルトの名無しさん mailto:sage [2005/07/23(土) 02:30:33 ] >>611 ありがとう。おかげで疑問点がはっきりしてきました。 x^n * x^n = (x * x)^n って、使っていいの? 我々は pow2 が累乗を返す関数だと知っているから、この変形は自然に見えるけど、 この問題で使っていいのは、あくまで pow2(x, 2n) = pow2(x, n) * pow2(x, n) pow2(x, 2n + 1) = x * pow2(x, n) * pow2(x, n) pow2(x, 0) = 1 の3式だけではないんだろうか?
613 名前:デフォルトの名無しさん mailto:sage [2005/07/23(土) 02:53:57 ] なるほど、確かに pow2(x * x, n) = pow2(x, n) * pow2(x, n) は自明ではないな。
614 名前:デフォルトの名無しさん mailto:sage [2005/07/23(土) 03:24:59 ] (define pow2 expt)
615 名前:デフォルトの名無しさん mailto:sage [2005/07/23(土) 03:43:39 ] >>612-613 pow2(x, 0) * pow2(x, 0) = pow2(x * x, 0) = 1 pow2(x, n) * pow2(x, n) = pow2(x * x, n) とすると 定義より pow2(x, n + 1) = x * pow2(x, n) (これも証明する?) なので pow2(x, n + 1) * pow2(x, n + 1) = x * pow2(x, n) * x * pow2(x, n) = (x * x) * (pow2(x, n) * pow2(x, n)) = (x * x) * pow2(x * x, n) = pow2(x * x, n + 1) 以上から数学的帰納法により pow2(x, n) * pow2(x, n) = pow2(x * x, n)
616 名前:デフォルトの名無しさん mailto:sage [2005/07/23(土) 05:11:48 ] >>615 数学的帰納法を使ったら pow2 の一般項 =x^n だって証明できてしまうと思われ。 そもそも関数の再帰的定義とは数学的帰納法を機械にやらせることなのに、 それを人間がやってしまったら本末転倒ではないかと。
617 名前:デフォルトの名無しさん mailto:sage [2005/07/23(土) 06:39:58 ] ん? 元々 x^n を求める pow2(x, n) を定義せよって話でしょ。 x^2n = x^n * x^n x^(2n+1) = x * x^n * x^n x^0 = 1 となる性質を使えって条件があるだけで。
618 名前:デフォルトの名無しさん mailto:sage [2005/07/23(土) 10:34:49 ] 求める関数を pow2(x,n), s(x,n)=log_x pow2(x,n) とおくと、pow2 漸化式は次のようになる。 s(0,x)=0 s(2n,x)=2*s(n,x) s(2n+1,x)=2*s(n,x)+1 ここまで見ると何となく s(n,x)=n になりそうな事が見えて来るが、 帰納法を使わず直観的に考えてみる。 s(n,x)の",x"を以後省略することとし、 nの2進表記を b_n...b_1b_0 とすると s(b_n...b_1b_0) =2*s(b_n...b_1)+b_0 =4*s(b_n...b_2)+2*b_1+b_0 ... =2^n*b_n+...+2*b_1+b_0 すなわち s(n)=n となる。 よって pow2(x,n)=x^n である。 故に>>614
619 名前:デフォルトの名無しさん mailto:sage [2005/07/24(日) 19:52:58 ] でもってexptを高速化する手法の一つが今回の問題だったんでないかい?
620 名前:デフォルトの名無しさん mailto:sage [2005/07/24(日) 20:17:31 ] ヒント:exptは浮動小数でも(略)
621 名前:デフォルトの名無しさん mailto:sage [2005/07/24(日) 21:58:13 ] R5RS には (expt EXACT INTEGER) => EXACT とは書いてないから (define (expt x n) (exp (* (log x) n))) な実装もアリ。 だから処理系に依存せずに EXACT ^ INTEGER => EXACT が欲しければ 自前で書くしかない。 Common Lisp だと (expt RATIONAL INTEGER) => RATIONAL が保証 されてるのに……
622 名前:デフォルトの名無しさん mailto:sage [2005/07/25(月) 08:43:33 ] >>621 ふが〜 おれ (expt 2 128) とかがEXACT INTEGERで正確に得られることを期待してコード書いてたけど、これ処理系依存になっちまうのか....いたいぜ。
623 名前:デフォルトの名無しさん mailto:sage [2005/07/25(月) 08:53:40 ] >>620 意味不明。(略)が(おれは無知です)の意味ならどうでもいいけど。
624 名前:デフォルトの名無しさん mailto:sage [2005/07/25(月) 09:04:10 ] expt は "Finally, the procedures listed below will always return an exact integer result provided all their arguments are exact integers and the mathematically expected result is representable as an exact integer within the implementation:" の中にある。
625 名前:デフォルトの名無しさん mailto:sage [2005/07/25(月) 10:30:53 ] >>624 THX!
626 名前:デフォルトの名無しさん mailto:sage [2005/07/25(月) 17:31:11 ] エキスパートシステムで、たとえば「stop」と入力した場合、 強制終了させるにはどうしたらいいんですか?
627 名前:デフォルトの名無しさん mailto:sage [2005/07/25(月) 17:32:57 ] 「stop」と入力されたときに強制終了すれば良いと思う。
628 名前:デフォルトの名無しさん mailto:sage [2005/07/25(月) 17:37:21 ] >>627 強制終了の仕方を教えてください
629 名前:デフォルトの名無しさん mailto:sage [2005/07/25(月) 18:03:19 ] >>628 期待した答えが返って来ないときは、質問のしかたが 間違ってる可能性が高いよ。 開発者なら、どういう言語のどういう処理系を使っていて、 どういう風に大域脱出したいのかを説明しないと。 けど、その前に近くにいる人に聞きなさい。それができない なら電源をいきなり切ってボスに辞表を叩きつければ、仕事を 強制終了できるよ。
630 名前:デフォルトの名無しさん mailto:sage [2005/07/25(月) 20:12:54 ] 人生を強s(ry
631 名前:デフォルトの名無しさん mailto:sage [2005/07/25(月) 20:15:08 ] 人生を強すぎる精神力で乗り切る。
632 名前:デフォルトの名無しさん [2005/07/26(火) 23:14:30 ] >>623 exptは浮動小数でも動くから、pow2がexptを高速化するという命題は 常に成り立たないということだよカス。
633 名前:デフォルトの名無しさん mailto:sage [2005/07/27(水) 01:54:37 ] ところでpow2って掛け算の回数最小になるんだろうか? 証明できるor反例ある?
634 名前:デフォルトの名無しさん mailto:sage [2005/07/27(水) 02:15:48 ] 3つ以上の項を一度に乗算する命令でも想定しない限りは自明だろう。 それくらい瞬間的にわからないというのはちょっとヤバイのでは。 pow2(x, n)=x^nについて考える。末端リーフがn個の二分木を考えてみろ。 二分木で高さが最小になるのはなるべく均等な木のときであることはわかるだろう。 その二分木の高さイコール乗算の回数だ。
635 名前:デフォルトの名無しさん mailto:sage [2005/07/27(水) 02:42:10 ] ごめん、大嘘でした。 >>634 はnが奇数のときは2を掛けるから偶数のときで乗算の数が違う ということを見落としてた。 (^ x 9) = (* x (let ((y (^ x 4))) (* y y))) => 6回 (^ x 4) = (let ((y (^ x 2))) (* y y))) => 4回 (^ x 2) = (let ((y (^ x 1))) (* y y))) => 3回 (^ x 1) = (* x (let ((y (^ x 0))) (* y y))) = x ;; ちょっと省略 => 2回 (^ x 7) = (* x (let ((y (^ x 3))) (* y y))) => 6回 (^ x 3) = (* x (let ((y (^ x 1))) (* y y))) => 4回 (^ x 1) = x => 2回
636 名前:デフォルトの名無しさん mailto:sage [2005/07/27(水) 04:38:27 ] >>633 乗算回数最小はこれでどうだろう? 最速かどうかは知らない。 (define (pow2 x n) (define (pow2-sub l m r) (if (= m 0) r (let loop ((l l)) (if (> (caar l) m) (loop (cdr l)) (pow2-sub (cdr l) (- m (caar l)) (* (cdar l) r)))))) (if (= n 0) 1 (let loop ((m 1) (two^prevm 1) (two^m 2) (r x) (l (list (cons 1 x)))) (if (<= two^m n) (let ((rr (* r r))) (loop (+ m 1) two^m (+ two^m two^m) rr (cons (cons two^m rr) l))) (pow2-sub l (- n two^prevm) r)))))
637 名前:デフォルトの名無しさん mailto:sage [2005/07/27(水) 04:45:26 ] 回数はこんな感じ。左から指数n、r=3^n、(expt 3 n)と比較しての検証、乗算の回数。 n=0 r=1 [OK] *-count=0 n=1 r=3 [OK] *-count=0 n=2 r=9 [OK] *-count=1 n=3 r=27 [OK] *-count=2 n=4 r=81 [OK] *-count=2 n=5 r=243 [OK] *-count=3 n=6 r=729 [OK] *-count=3 n=7 r=2187 [OK] *-count=4 n=8 r=6561 [OK] *-count=3 n=9 r=19683 [OK] *-count=4 n=10 r=59049 [OK] *-count=4 n=11 r=177147 [OK] *-count=5 n=12 r=531441 [OK] *-count=4 n=13 r=1594323 [OK] *-count=5 n=14 r=4782969 [OK] *-count=5 n=15 r=14348907 [OK] *-count=6 n=16 r=43046721 [OK] *-count=4 n=17 r=129140163 [OK] *-count=5 n=18 r=387420489 [OK] *-count=5 n=19 r=1162261467 [OK] *-count=6 n=20 r=3486784401 [OK] *-count=5
638 名前:デフォルトの名無しさん [2005/07/27(水) 13:21:00 ] いきなり横レスですみません、超初心者です。こことSICPのスレは とても勉強になるので感謝してます。上のアイデアというか原理は たとえば 3^20 = (3^4)^5 = ((3^2)^2)^(2*2+1) で5回って意味でしょうか? ……うぅぅ凄すぎて式が追えないorz
639 名前:デフォルトの名無しさん mailto:sage [2005/07/27(水) 20:58:21 ] 順番が前後するが 3^20=3^16*3^4 ... 1回 3^16=3^(2^4)=(((3^2)^2)^2)^2 ... 4回 3^4は3^16を求める途中で得られているので0回 合計5回
640 名前:デフォルトの名無しさん mailto:sage [2005/07/27(水) 23:36:31 ] s/順番が前後するが/話が前後するが/
641 名前:デフォルトの名無しさん mailto:sage [2005/07/28(木) 00:25:58 ] あほ
642 名前:デフォルトの名無しさん mailto:sage [2005/07/28(木) 22:57:26 ] >>632 最初からそう書けよ。 相手する価値もないヤシだってすぐわかるからさ。
643 名前:638 [2005/07/29(金) 04:53:54 ] >>639 レスありがとうございます。やっと SICP の1.2.4節に辿り着きました mitpress.mit.edu/sicp/full-text/book/book-Z-H-11.html#%_sec_1.2.4 後半の改善策が >>589 と同じ例題で、 ;nが偶数なら b^n = (b^(n/2))^2 ;nが奇数なら b^n = b*b^(n-1) 解答も >>607 と似てました。これを使った乗算回数は、たとえば 3^20 = (3^10)^2 = ((3^5)^2)^2 = ((3*3^4)^2)^2 = ((3*((3^2)^2))^2)^2 で理屈上は>>636 と同じ5回(でも実は末尾で余計に1掛けたりとかで、少し多そう)。 オーダーとしてはどちらも log2(n) で、>>634 の話が実は正しいような気がしました Orders of Growth を理解するための頭の体操とはいえ、疲れた… まだ木構造リストの演算をきちんと勉強してないので、勘違いしてたらすみません
644 名前:デフォルトの名無しさん [2005/07/29(金) 23:03:59 ] age
645 名前:デフォルトの名無しさん [2005/08/08(月) 17:23:07 ] a b c d dd e f g h i j k というインデント付きのテキストから (a b (c (d (dd) e) f g (h (i)) j) k) というリストを得たいのですが、 どうやったらうまく書けるかいまいちよくわかりません。 再帰を使えばよさそうというのはわかるんですが。 スタックみたいなバッファが必要でしょうか? ちなみにテキストデータの仕様は 半角2文字インデントで1階層を表現して、 ddみたいな数階層上のインデントがあっても直前の階層の1つ上とみなす。 a, b, c ・・・はシンボルです。
646 名前:デフォルトの名無しさん [2005/08/08(月) 17:35:29 ] 入力の話を簡単にするために、 ((a 0) (b 0) (c 2) (d 4) (dd 12) (e 4) (f 2) (g 2) (h 4) (i 6) (j 2) (k 0)) という(シンボル インデント文字数)という組のリストから (a b (c (d (dd) e) f g (h (i)) j) k) という形に直すにはどうしたらいい? ということでお願いします。 逆の変換は簡単にできそうなんですが・・・。
647 名前:デフォルトの名無しさん mailto:sage [2005/08/08(月) 18:28:54 ] どっかの宿題?
648 名前:デフォルトの名無しさん mailto:sage [2005/08/08(月) 18:34:19 ] いいえ、思いつきです。。 ちなみに25過ぎのおっさんですよ。。
649 名前:デフォルトの名無しさん mailto:sage [2005/08/08(月) 18:46:54 ] つーか久しぶりにSchemeやってんだけど 頭固くなってるというか、頭悪くなってる。 仮にeまでだとして、 スタックで持ちまわって ((a)) ↓ ((b a)) ;; 同一インデントはそのままスタック先頭にcons ↓ ((c) (b a)) ↓ ((d) (c) (b a)) ↓ ((dd) (d) (c) (b a)) ↓ ((d (dd) e) (c) (b a)) ((c (d (dd) e)) (b a)) ((a b (c (d (dd) e)))) => (a b (c (d (dd) e))) みたいな感じで並べ替えればいいのはなんとなくわかるんだけどね。 肝心のコード思いつかない。
650 名前:デフォルトの名無しさん mailto:sage [2005/08/08(月) 20:39:31 ] 汚く、token がchar の、indent(space)-num conscious な gauche 版ならできた。 (define (port->sp/char/nls iport) (reverse (fold (lambda (x y) (cond ((eq? x #\newline) (cons '() y)) ((null? y) `((,x))) (else (cons `(,@(car y) ,x) (cdr y))))) '() (port->list read-char iport)))) (define (proc arg) (let lp ((rest arg) (temp '()) (result '())) (if (null? rest) (reverse (if (null? temp) result `(,(proc temp) ,@result))) (let ((node (car rest))) (case (length node) ((0) (if (null? temp) (lp (cdr rest) '() result) (lp (cdr rest) '() `(,(proc (reverse temp)) ,@result)))) ((1) (if (null? temp) (lp (cdr rest) '() `(,(car node) ,@result)) (lp (cdr rest) '() `(,(car node) ,(proc (reverse (cons (cdr node) temp))) ,@result)))) (else (lp (cdr rest) `(,(cdr node) ,@temp) result)))))))
651 名前:デフォルトの名無しさん mailto:sage [2005/08/08(月) 20:40:04 ] (proc (port->sp/char/nls (open-input-string "a b c d dd e f g h i j k"))) => (#\a #\b (#\c (#\d (((((#\d))))) #\e) #\f #\g (#\h (#\i)) #\j) #\k)
652 名前:デフォルトの名無しさん mailto:sage [2005/08/08(月) 21:04:45 ] むっ! Pythonのトランスレータを書こうとしているな。
653 名前:デフォルトの名無しさん mailto:sage [2005/08/08(月) 21:07:47 ] > ((dd) (d) (c) (b a)) > ↓ > ((d (dd) e) (c) (b a)) ここがよく分からない.eを新たにプッシュするときに,どうしてdはeと同じ リストに含めて,ddは1つネストしたリストに入っているの? もっと言えば, (c)や(a b)はd,ddと全く別の扱いを受ける必然性もないように見える. 要するに,リストのネストの深さを保存してないよ,ってこと.
654 名前:デフォルトの名無しさん mailto:sage [2005/08/08(月) 21:59:58 ] a b c d dd ee e f g h i j k とかなってたらeeはどうするのか? ということを考えると >ddみたいな数階層上のインデントがあっても直前の階層の1つ上とみなす。 はよろしくないんじゃないかな。それとも構文エラー?
655 名前:デフォルトの名無しさん mailto:sage [2005/08/08(月) 22:16:21 ] >>653 インデントの情報も付加して説明すると、 (((a) 0)) ;; インデント0の組 ↓ (((b a) 0)) ;; 同一インデントはそのままスタック先頭にcons ↓ (((c) 2) ((b a) 0)) ;; インデント2>0なので新規にスタック追加 ↓ (((d) 4) ((c) 2) ((b a) 0)) ;; インデント4>2なので新規にスタック追加 ↓ (((dd) 12) ((d) 4) ((c) 2) ((b a) 0)) ;; インデント12>4なので新規にスタック追加 ここで(e 4)がくると(d 4)までスタックを撒き戻すという意味です。 撒き戻すついでにreverseして整える。 ↓ (((d (dd) e) 4) ((c) 2) ((b a) 0)) さらにeが終端なので連鎖して撒き戻し&reverseが発生する (((c (d (dd) e)) 2) ((b a) 0)) ↓ (((a b (c (d (dd) e))) 0)) => (a b (c (d (dd) e))) それで結果がこうなればいいんじゃないか、ということです。 でも 2 -> 12 -> 4とかのパターンだと 12を4とみなすとか例外作らないとだめかなあ。 >>650 早速ありがとうございます。 コード研究してみます。
656 名前:デフォルトの名無しさん mailto:sage [2005/08/08(月) 22:18:33 ] >>654 上にも書いたけど、それさっき気づきました。 やっぱ インデント構造はそのまま保持して、 後から遊びを修正するようにした方が利口かもしれない。
657 名前:デフォルトの名無しさん mailto:sage [2005/08/08(月) 22:37:15 ] あー、>>654 の場合は構文エラーというのも悪くないですね。 「ぶら下がる親があいまい」とかで。 様式的に654の様なケースはありえなさそうだし。
658 名前:デフォルトの名無しさん [2005/08/10(水) 22:19:54 ] >>650 氏のコードを自分の想定した入力形式に書き換えてみました。 (define (proc arg) (let loop ((rest arg) (temp '()) (result '())) (if (null? rest) (reverse (if (null? temp) result `(,(proc (reverse temp)) ,@result))) (let ((node (car rest))) (if (< (car node) 2) (loop (cdr rest) '() (if (null? temp) `(,(cadr node) ,@result) `(,(cadr node) ,(proc (reverse temp)) ,@result))) (loop (cdr rest) `(,(cons (- (car node) 2) (cdr node)) ,@temp) result)))))) (proc '((0 a) (0 b) (2 c) (4 d) (12 dd) (4 e) (2 f) (2 g) (4 h) (6 i) (2 j) (0 k) (2 m))) =>(a b (c (d ((((dd)))) e) f g (h (i)) j) k (m)) (< (car node) 2)の箇所はインデント幅が奇数だったら小さい側へ切捨てる処置です。
659 名前:デフォルトの名無しさん [2005/08/10(水) 22:28:19 ] それと入力を作って、 (define (read-indent-text) (define (space-count str) (let ((len (string-length str))) (let loop ((i 0)) (if (and (< i len) (char=? (string-ref str i) #\space)) (loop (+ i 1)) i)))) (let loop ((str (read-line)) (r '())) (if (eof-object? str) (reverse r) (let ((pos (space-count str))) (loop (read-line) (cons (list pos (substring str pos)) r)))))) ----ind.txt---- root1 abc def gef aaa bbb ccc root2 aaa ----ind.txt---- (proc (with-input-from-file "ind.txt" (read-indent-text))) =>("root1" ("abc" "def" ("gef") "aaa" ("bbb") "ccc") "root2" ("aaa")) こんな感じになりました。
660 名前:デフォルトの名無しさん [2005/08/10(水) 22:48:55 ] ついでに逆変換も作りました。(これは1分でできた。) (define (ind-pp s . indent) (define (spaces n) (if (zero? n) #t (begin (write-char #\space) (spaces (- n 1))))) (set! indent (if (pair? indent) (car indent) 0)) (let loop ((x s)) (if (pair? x) (if (pair? (car x)) (begin (indent-pp (car x) (+ indent 2)) (loop (cdr x))) (begin (spaces indent) (display (car x)) (newline) (loop (cdr x)))) #t))) (ind-pp '("root1" ("abc" "def" ("gef") "aaa" ("bbb") "ccc") "root2" ("aaa"))) root1 abc def gef aaa bbb ccc root2 aaa =>#t 結構手間掛かりましたね。。
661 名前:デフォルトの名無しさん mailto:sage [2005/08/10(水) 23:16:41 ] fun.sci.fukuoka-u.ac.jp/wiki/index.php?xyzzy のscheme-modeをgaucheのgoshをインタプリタとして使ってみたいのですが、 そういう使い方してる人います? できれば教えて下さい。 またこれ以外でも、xyzzyで使えるscheme-modeがあれば紹介してください。
662 名前:デフォルトの名無しさん [2005/08/10(水) 23:37:10 ] リストに入れた関数を一つの引数に次々に適用するにはどうするのがよいのでしょうか? 状況としてはユーザからの入力値をチェックすることを考えています。 例えばチェック用関数 func_a, func_b, func_c, func_d と入力値 x, y, z があり x については func_a と func_b, y については func_a と func_c, z については func_a と func_d, によるチェックを行いたいわけなんです。 そこで x の場合 (func_a, func_b) と x を引数にとってリスト ((func_a x) (func_b x)) を 返すようにしたいのですが map のような便利な関数はないのでしょうか? あるいはリストに入れた関数を一つの引数に次々に適用するよりも 適切な方法はありませんでしょうか?
663 名前:デフォルトの名無しさん mailto:sage [2005/08/11(木) 00:26:44 ] (define (hoge func-list x) (map (lambda (f) (f x)) func-list)) (hoge (list (lambda (x) (+ x x)) (lambda (x) (* x x))) 10) => (20 100)
664 名前:デフォルトの名無しさん mailto:sage [2005/08/11(木) 01:08:58 ] お約束キタ━━━━━━(゚∀゚)━━━━━━!!!
665 名前:デフォルトの名無しさん mailto:sage [2005/08/11(木) 01:30:32 ] おおぅ、こんなところに誤爆してたのか orz
666 名前:デフォルトの名無しさん mailto:sage [2005/08/11(木) 23:41:25 ] >>661 どっかでgoshの-iオプションを使うとか聞いたことがあるようなないような。
667 名前:デフォルトの名無しさん mailto:sage [2005/08/12(金) 08:36:46 ] >>645 亀だけど Gauche で書いてみた. 入力は ((シンボル . インデント数) ...) みたいな感じ. (use srfi-1) (define (iexpr->list xs) (define (f xs level rs) (if (null? xs) (values xs (reverse! rs)) (receive (sym l) (car+cdr (car xs)) (cond ((= l level) (f (cdr xs) l (cons sym rs))) ((< l level) (values xs (reverse! rs))) (else (receive (rest res) (f xs l '()) (f rest level (cons res rs)))))))) (values-ref (f xs 0 '()) 1))
668 名前:デフォルトの名無しさん mailto:sage [2005/08/15(月) 23:19:44 ] >>667 からvalues関係を取っ払ってみた。 そんだけ。 (define (iexpr->list xs) (define (f xs level rs) (if (null? xs) (cons xs (reverse! rs)) (let ((sym (caar xs)) (l (cdar xs))) (cond ((= l level) (f (cdr xs) l (cons sym rs))) ((< l level) (cons xs (reverse! rs))) (else (let ((x (f xs l '()))) (f (car x) level (cons (cdr x) rs)))))))) (cdr (f xs 0 '()))) >(iexpr->list '((a . 0)(b . 1)(c . 4)(d . 5)(d . 2)(e . 3)(f . 0))) =>(a (b (c (d)) (d (e))) f) なかなか面白いですな。 これ使って何かに繋がらないかな。 すぐ思いつくのはGUIコントロールの階層表現ぐらいだけど。
669 名前:デフォルトの名無しさん mailto:sage [2005/08/21(日) 22:40:48 ] Schemeのコンパイラなどで使うというCPSについてわかりやすく 解説してるページはありますか? コンパイラとかの中間言語としてのCPSとか、CPSへ/からの変換が 知りたいといいますか。英語でもいいです。 継続とは何ぞやとか、 普通の場合に戻ってから実行する処理をクロージャとして渡せば 一般の言語で継続渡し形式で書ける、という程度の継続渡しの 理解はしてるつもりです。
670 名前:デフォルトの名無しさん mailto:sage [2005/08/21(日) 23:13:14 ] >>669 とりあえずSICP嫁。英語ならWebで読める。
671 名前:デフォルトの名無しさん mailto:sage [2005/08/21(日) 23:37:09 ] SICPは読みかけの途中で止まってます。どのへんに書いてありますか?
672 名前:デフォルトの名無しさん mailto:sage [2005/08/21(日) 23:44:38 ] あとは、東大のコンパイラ演習のレジュメとか ttp://www.is.s.u-tokyo.ac.jp/~vu/97/jugyo/processor/compilerresume/
673 名前:デフォルトの名無しさん [2005/08/22(月) 00:11:36 ] Scheme用のRSS解析ライブラリってないの? perlのXML::RSSみたいなの.
674 名前:デフォルトの名無しさん mailto:sage [2005/08/22(月) 00:38:14 ] SXMLとSXPATHでは足りない?
675 名前:643 [2005/08/22(月) 00:47:55 ] よりらくちんにやりたいのです.
676 名前:デフォルトの名無しさん mailto:sage [2005/08/22(月) 02:56:42 ] >>673 LISPはクローズドな開発が多いから ここで「〜ない?」系の質問しても答えはほとんど「無い」が返ってくると思っていい。 どうしても必要なら自分で書け。 そしてコミュニティに還元しろ。
677 名前:643 mailto:sage [2005/08/22(月) 09:31:13 ] >>676 なるほど! じゃあ,がんばって書くよ.
678 名前:デフォルトの名無しさん mailto:sage [2005/08/22(月) 10:58:41 ] LISPだと簡単に書けちゃうから、逆にあまり再利用を考えずに自分専用のを 作って使い捨てしちゃうってことはあるね。 >>677 がんがれ
679 名前:デフォルトの名無しさん [2005/08/30(火) 13:54:52 ] Lisp に少し興味を感じています。 あまりにも他の言語と異質な感じをうけるため、心理的な抵抗感も実はあります。 Scheme は Lisp の派生あるいは方言である、と入門サイトに記述されています。 両言語の特性の違いについて、実際にプログラムを組んでいる方の感覚とご理解から 意見を伺いたいです。Lispが優れている言語ならば、それをもとにしたSchemeを 学習する方が良いのだろうか、と悩んでいます。 経済的な理由からLinuxマシンを新規に構成するのではなく、現在使用中の Windowsマシンで Lisp/Scheme を学びたいと思っています。
680 名前:デフォルトの名無しさん mailto:sage [2005/08/30(火) 19:51:41 ] >>679 CommonLispならcoLinux(ただしXP/2000限定)を入れてcmucl、 Windows単体で動かしたいならclisp使うとか。 Schemeなら日本語リソースではgauche、 とにかく速いのがいいならbiglooかな。
681 名前:デフォルトの名無しさん mailto:sage [2005/08/30(火) 20:01:43 ] お勉強目的なら xyzzy でいいんじゃね? エディタとしてもよく出来てるし。
682 名前:デフォルトの名無しさん mailto:sage [2005/08/30(火) 20:07:21 ] >>681 xyzzyはかなり方言だし、ちゃんとしたclispあたりのほうが良いと思う。 Scheme系ならgaucheかな。
683 名前:デフォルトの名無しさん mailto:sage [2005/08/30(火) 21:34:10 ] >>680 >>681 >>682 皆様のおかげで、5つの実装・環境について特徴を知ることができました。 奥深いのですね。ありがとうございます。 調べたところ、エディタ xyzzy には熱心な愛好者が多そうですね。 Lispの言語としての魅力と関係があるように印象を受けました。 お勧めのgaucheを少し検索しました。 Kahuaというウェブアプリケーション作成の仕組みがあるとか・・ 時間をつくってお勧めを参考に Lisp/Scheme を勉強してみます。
684 名前:デフォルトの名無しさん mailto:sage [2005/08/30(火) 21:52:14 ] >>683 あんまし色々言うと混乱させてしまうかもしれないけれど、 とりあえず動かしたいということだったら IDE もついてくる PLT Scheme が楽かも。 xyzzy がとっつきやすいのと同じ理由で。 一応日本語方面も外国ものとしてはそれなりだし。 でも、教科書とにらめっこして勉強するんじゃなく、 実際自分で使う小物スクリプトを色々書きながら勉強するというスタンスだったら gauche が一番向いてるのかな。 そもそもスクリプティングに使いやすいものを、という開発方針だった気がするし。 何にせよ、Scheme は善かれ悪しかれ処理系ごとの個性が強いので 色々な処理系を試してみて、一旦これ、と決めたら、 それの使い方を詳しくつっこんでみるのがいいと思う。
685 名前:デフォルトの名無しさん mailto:sage [2005/08/30(火) 22:35:37 ] 結局、Schemeはスマートだけどライブラリが不足している現状があり、 それが処理系ごとの違いに繋がってるんだと思う。 Gaucheくらい充実してればSchemeも楽しい。
686 名前:デフォルトの名無しさん [2005/08/30(火) 23:14:12 ] 日本語を扱いに長けているcommon lispの処理系には何がありますか? schemeだったらgaucheで決まりなんだけど、common lispは良さそうなのが 見当たりません。
687 名前:デフォルトの名無しさん mailto:sage [2005/08/30(火) 23:20:45 ] >>686 最近のclispはSJIS/JIS/EUC/Unicode自由自在だよ。 clisp.cons.org/impnotes/encoding.html
688 名前:デフォルトの名無しさん [2005/08/31(水) 00:12:43 ] Petite Chez Scheme というのを ChezEdit-NT というエディタで動作させるのも楽しそう。
689 名前:デフォルトの名無しさん mailto:sage [2005/09/01(木) 13:15:57 ] スレ違いならすんませんが、Scheme勉強しようと思って、 OSX TigerにGauche 0.8.5インストールしたところリンクが通らず、 Finkでdlcompat入れろつーことらしいから(10.2だけど)、 Fink入れてみたんだけどdlcompatとかなさそうで、 ほんじゃってんで、ports入れてみて、 dlcompat落としてみたら、コンパイルできんって感じでげす...orz どげにしたらインストでけるんでがしょ?
690 名前:デフォルトの名無しさん mailto:sage [2005/09/01(木) 13:35:34 ] しかるべき場所でちゃんとした言葉遣いで相談したほうが良いと思います。
691 名前:デフォルトの名無しさん mailto:sage [2005/09/01(木) 14:06:18 ] port install gauche
692 名前:デフォルトの名無しさん mailto:sage [2005/09/01(木) 21:30:54 ] gaucheの特徴 ・define-macroがある ・マニュアルが日本語(ライブラリも) ・ライブラリが豊富 ・Cで簡単に拡張できる。
693 名前:デフォルトの名無しさん mailto:sage [2005/09/02(金) 04:52:45 ] >>686 SBCL は最近、日本語通る様になった
694 名前:686 mailto:sage [2005/09/03(土) 01:42:43 ] >>687 >>693 おまいら、ありがとうございます。 >>950 は次スレのテンプレに日本語使える処理系情報を追加しておくように。
695 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 05:56:43 ] gaucheでhttpクライアントを作ろうとしています。 このとき http-get 関数に :Accept-Encoding "gzip, compress" を 指定して圧縮されて受け取ったデータを展開するにはどうすればよいでしょうか? javaみたいにgzipのストリームがあれば便利なんですが、ストリームどころか 素のgzipのユーティリティも見当たらないようです。 知ってる方お知恵をお貸し下さい、おながいします。
696 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 16:34:33 ] とりあえず何とかしたいなら、プロセスポートを 使ってgzipを呼ぶようにすれば? rfc.mimeも使うよね。
697 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 23:19:40 ] ttp://www.rubyist.net/~matz/20050830.html#p01 Paul Grahamが(言わなきゃいいのに)本音を漏らしちゃった話。 言語デザイナーとしての限界とか、無理して作るなとか、さんざんなこと言われてる。
698 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 23:57:02 ] >>697 個人的にはPaulの意見は理解できる。つーか、Matz僻みすぎ。
699 名前:デフォルトの名無しさん mailto:sage [2005/09/04(日) 00:00:15 ] やっぱLISPは完成度が高すぎるんだな。 Paul一人ごときが進化できる代物ではないと。 Guyぐらいの天才でもないと。
700 名前:デフォルトの名無しさん mailto:sage [2005/09/04(日) 02:06:14 ] たしかに完成度は高いのかもしれんが、 抽象度の高いものは、漏れのような頭の悪い奴らにとっては使いこなすのが難しいわけで。 そういう意味で、Perl, Python, Rubyのような言語ってのは、脳味噌が一部不自由でもLispの パワーの片鱗に触れられるって点で意味はあると思うんだけどな。 で、より毛深くなりたくなったら、Lisp/Schemeの世界に足を踏み入れればよいのだし。 結局のところ動的言語使いはLispに始まりLispに帰るのか。
701 名前:デフォルトの名無しさん mailto:sage [2005/09/04(日) 02:15:22 ] 比較的簡単な問題をちょいちょいっと手続き型で書いていく時は、LispよりPythonの方が便利だと思う。 公式ライブラリが豊富なのもこの長所を延ばしてる。 Perlはawkの改良として、歴史的意味があった。 Rubyは...えーっと...
702 名前:デフォルトの名無しさん mailto:sage [2005/09/04(日) 04:10:30 ] arc は Vaperware への道をまっしぐら感が強いよなあ。 >>695 wiliki の方でも訊いてみてはどうでしょ。 >>696 みたいな感じの答えになりそうな気はするけれど、 具体的なコードも出してくれるかも知れんし。
703 名前:デフォルトの名無しさん mailto:sage [2005/09/04(日) 04:53:54 ] Arc も、もう少し志を低くして (asdf-install:install 'arc) で使える便利ライブラリ、くらいにするといいんだよ。
704 名前:デフォルトの名無しさん mailto:sage [2005/09/04(日) 07:30:26 ] Haskell ,Clean 等は効率的で、LISP, SCHEME は万能である。 万能とは、科学者にとって悲しむべき特性である。
705 名前:デフォルトの名無しさん mailto:sage [2005/09/04(日) 11:24:03 ] とはいえLispも今までいろいろ進化してきたしな。 これで完成だとか言ってると危ないかも。
706 名前:デフォルトの名無しさん mailto:sage [2005/09/04(日) 11:25:21 ] そういえば、LISPでも関数を特別視してるけど、 それをなくしたら新しい文化ができるかも。 つまり、関数呼び出しは全てfancall, applyを使う。
707 名前:デフォルトの名無しさん mailto:sage [2005/09/04(日) 12:16:58 ] funcall も apply も関数ですが ていうか scheme では既に特別視してないし
708 名前:デフォルトの名無しさん mailto:sage [2005/09/04(日) 13:01:47 ] じゃあ、定理証明系見たいなノリでmacroで作ったやつをmapできたりさせよう。
709 名前:デフォルトの名無しさん mailto:sage [2005/09/04(日) 13:09:09 ] 他の言語なら適当な文法考えるだけでなにか 新しいものを追加した気分になれるがlispだと そんなのマクロで書けるじゃんでほとんど終わる ので圧倒的に不利なきがする
710 名前:デフォルトの名無しさん mailto:sage [2005/09/04(日) 13:15:42 ] 個人的には理論的純粋さよりも実用性だな。ライブラリがあればいい。 ANSI Common Lisp + ネットワーク + 国際化 + XML + ... みたいなノリで CLtL3 を作って標準化してほしい。