CommonLisp Scheme Pa ..
555:デフォルトの名無しさん
05/07/09 00:06:49
>>553
重箱の隅ですまんが append ではなく nconc、#` ではなく #' だね。
556:デフォルトの名無しさん
05/07/09 02:43:36
素人質問への解答乙。
つか、明らかに荒らしだよなこいつの質問は。
557:デフォルトの名無しさん
05/07/09 02:44:24
基本的な関数のみで書いた、初心者向け版。
(defun p (x)
(if (null x) '()
(if (consp (car x))
(append (p (car x))
(p (cdr x)))
(cons (car x)
(p (cdr x))))))
558:デフォルトの名無しさん
05/07/09 03:01:55
Scheme には mapcan が無いとお嘆きの貴兄に、Scheme 版。
(define (p x)
(if (list? x)
(apply append (map p x))
(list x)))
559:デフォルトの名無しさん
05/07/09 03:49:56
nconc や append! を使う自信が無くて、つい append を使ってしまう自分。
560:デフォルトの名無しさん
05/07/09 09:51:51
(defun p (x)
(cond ((null x) '())
((consp x)
(nconc (p (car x))
(p (cdr x))))
(t (cons x '()))))
(p '((x . y) (x)))
561:デフォルトの名無しさん
05/07/09 16:49:29
>>559
静的関数型言語方面じゃ型推論と同じなノリで、
破壊しても問題ないと推論される場合には破壊的にやっちゃうようなコードを吐かせよう、
みたいなことやってるみたいね。
URLリンク(sky.zero.ad.jp)
562:デフォルトの名無しさん
05/07/09 19:21:50
>>548
うまいこと宿題やってもらえて良かったね。
563:デフォルトの名無しさん
05/07/09 21:46:39
最近に処理系では破壊的な方が速いとは限らない
みたいなことがANSI Common Lisp(P. Graham)に書いてあったんだけど、そんなもんなのかね。
どうしたらそうなるのか見当もつかないんだが。
564:デフォルトの名無しさん
05/07/09 22:03:44
gcがめちゃくちゃ速いから?
565:デフォルトの名無しさん
05/07/09 22:15:14
Write Barrier のコストとか。
566:デフォルトの名無しさん
05/07/10 00:09:20
copy on write とか?
567:デフォルトの名無しさん
05/07/10 00:14:17
URLリンク(www.ai.mit.edu)からcl-http-70-190a.tar.gz落として
cmuclで動かそうとしたんだけどパッチすらあたらなかった。
うまく動作してる人いない?
568:デフォルトの名無しさん
05/07/10 02:21:43
>>561
ああっ、それいいなあ。
LISP と関数型言語の差って、何でも自分でいじれるオフロード車と、外装内
装に便利なものが作り込まれたタウンカーの差みたいなものかな。
569:デフォルトの名無しさん
05/07/11 22:48:53
総称関数モデルがメッセージ駆動モデルよりも強力だといえるのは何故?
メリットとかデメリットとか教えて欲しい。
570:デフォルトの名無しさん
05/07/11 23:08:22
>>569
メッセージ駆動モデルって何?
571:デフォルトの名無しさん
05/07/12 00:21:25
>>570
メソッドはオブジェクトに属していて、オブジェクトにメッセージを送ることでメソッドが活性化される。
メソッドはデータと一緒に継承される。
SmalltalkとかJavaとかはメッセージ駆動モデルなんだって。
572:デフォルトの名無しさん
05/07/12 00:29:57
それって総称関数のサブセットじゃないか
573:デフォルトの名無しさん
05/07/12 02:54:29
Lisp 関係の古典がオンラインで読めるようになったので一応アドレス貼っておきますね。
John McCarthy, Paul W. Abrahams, Daniel J. Edwards, Timothy P. Hart and Michael I. Levin.
LISP 1.5 Programmer’s Manual.
The M.I.T. Press, 1962, second edition.
URLリンク(community.computerhistory.org)
Berkeley and Bobrow, editors.
The Programming Language LISP: Its Operation and Applications.
Information International, Inc., March 1964 and The MIT Press, April 1966.
URLリンク(community.computerhistory.org)
574:デフォルトの名無しさん
05/07/12 03:50:45
>>571
そういう話は無益だから止めれ
Java にメッセージ式は無い
Smalltalk のメソッドはクラスに属している(クラスもオブジェクトだけど)
575:デフォルトの名無しさん
05/07/12 09:17:12
Rubyyyyyyyyyyyyyyyyyyyyyyyy
576:デフォルトの名無しさん
05/07/12 17:19:47
とりあえず総称関数だとマルチメソッドが考えやすい。レシーバーだけでなく、複数の引数のクラスで処理を分けたいときに便利。
その分、メソッドが特定のクラス(やオブジェクト)に属さないのでオブジェクト指向モデリングとやや相性が悪い。
総称関数の方ができることが多い(いや、究極的にはできることは同じだけどやり易さとして)けど、オブジェクト指向とはちょっと考え方が違う感じ。メッセージモデルの方がオブジェクト指向らしい。
もっと計算理論的な話は別の人に任す。
577:デフォルトの名無しさん
05/07/12 21:51:56
複数引数の型を見て処理を割り振る話(メソッド・ディスパッチだっけ?)について。
多くのOO言語では、静的な解決しかできない。
総称関数ベースなら、呼び出された時の型を見て動的に処理を割り振ることができる。
これがメリット?
578:デフォルトの名無しさん
05/07/12 22:15:42
>>577
マルチディスパッチと動的ディスパッチは一応別の問題だよね。
Smalltalkなんかはシングルの動的ディスパッチじゃないかな。
静的なマルチディスパッチの例としてはC++の関数や演算子ね。
579:デフォルトの名無しさん
05/07/12 22:20:22
えぇ〜とLispのは、具体的なメソッド選択を明示的に書く仕組みだったと思います。(実使用体験0、80年代のbit記事受け売り)
ってな話だと、>>578とは違うんじゃないかなぁ〜。
580:デフォルトの名無しさん
05/07/12 22:39:20
>>577
>多くのOO言語では、静的な解決しかできない。
んな事は無い
581:577
05/07/12 22:42:26
>>580
そのとおり。
でも、引数を親クラスにキャストしてメソッド呼出したら、、、
582:デフォルトの名無しさん
05/07/12 22:53:23
何でキャストの話が出て来るんだよ
OO のモデルなんか趣味の世界だから、自分で使って勝手に判断すれば良い
583:577
05/07/13 00:00:29
なんだぁ?ヴァカか。
584:デフォルトの名無しさん
05/07/13 01:03:28
では、そろそろ LISP の話に戻りましょうか
585:デフォルトの名無しさん
05/07/13 02:14:15
まとめると
総称関数だといくつかのクラスにまたがった複数引数をとるメソッドがかける
ってことか
586:デフォルトの名無しさん
05/07/14 15:03:45
SICPの5.4 The Explicit-Control Evaluatorで、
> Our Scheme evaluator register machine includes a stack and
> seven registers: exp, env, val, continue, proc, argl, and unev.
とあるのですが、unevという名前の意味や由来は何なのでしょうか?
他のものは一目瞭然なのですが、unevだけ全く見当がつきません。
587:デフォルトの名無しさん
05/07/14 15:09:51
>>586
unevaluated (未評価)かな?
588:586
05/07/14 19:58:40
>>587
なるほど!
確かに「後で評価する式を格納しておく」という使い方をされてますから、
それで正解だと思います。ありがとうございました。
ああすっきりした! 今日は気持ちよく眠れる!
589:デフォルトの名無しさん
05/07/22 14:37:51
xn(n ∈ N)は,次のように再帰的に定義することができる.
xn = xm×xm (n = 2m,m >= 1)
= x×xm×xm (n = 2m+1,m >= 0)
= 1 (n = 0)
これを利用して,xnを計算する2引数関数pow2を定義せよ.なお,再帰呼び出しの回数をできるだけ減らすようにすること.
これ教えてもらえませんでしょうか…
解答例をお願いします。。。
590:589
05/07/22 14:41:15
あぁ、書き忘れ。schemeです。
591:デフォルトの名無しさん
05/07/22 15:03:50
夏休みの宿題くらい自分でやれ
592:デフォルトの名無しさん
05/07/22 15:27:50
「できるだけ」ってのがひっかかるな。
593:デフォルトの名無しさん
05/07/22 15:39:49
どうしてもループに直せないおバカ救済用じゃね?
594:デフォルトの名無しさん
05/07/22 15:55:59
Lispもschemeもうぜえええええええええ
595:589
05/07/22 16:02:10
出来ないからこうして書いてるんです( ´,_ゝ`)
596:デフォルトの名無しさん
05/07/22 16:14:52
出来ないなら教官に質問しにいくとかすれば?
出来ないことを色々考えて出来るようになるのが学生の仕事だろ?
ロクに考えもせずに答教えろとか言う奴は単位なぞ落としてしまえ。
597:デフォルトの名無しさん
05/07/22 16:36:44
最近の小学校はScheme教えてるのか。すごいな。
598:デフォルトの名無しさん
05/07/22 18:16:05
※しょうがくせいのみんなへ
・なつやすみのしゅくだいは、じぶんでやりましょう。
599:?デフォルトの名無しさん
05/07/22 22:03:21
Schemeの問題で
>再帰呼び出しの回数をできるだけ減らすようにすること
ってのはどんなんだろうね?
再帰をなるべく末尾再帰にしろってんならいいんだけど。
600:デフォルトの名無しさん
05/07/22 23:29:41
x は関数または演算子なんだよね?x×(xm×xm)って、演算子と整数の
積なの?意味がわからない。
601:デフォルトの名無しさん
05/07/22 23:43:50
頭悪いのを披露するためだけにわざわざ横から出てきてごくろうさん。
602:600
05/07/22 23:45:57
あ、問題を読み間違えていた。
603:ビッケ ◆Jyl0Z1ahKc
05/07/22 23:52:54
xnなどと書かれているのはベキ乗 x^n のことでしょう。
「再帰呼び出しの回数」については、設問中のベキ乗の定義を見ると
再帰呼び出しのネスティングの深さのことを言ってるのかも知れませんね。
その授業(?)でそういうことを扱った直後の演習問題とか。
「できるだけ」なんていわれても困るけど、設問中の定義に従って
ネスティングの深さがO(log n)となる定義を書けばOKということなのかも。
604:デフォルトの名無しさん
05/07/23 00:02:33
ちゃんと自分の頭で噛み砕いて質問すれば親切な香具師は答えてくれる
かもしれんが、ここまで露骨に「宿題やって」だと誰も答えてくれんわな。
605:デフォルトの名無しさん
05/07/23 00:12:28
これ、ループに直せるの?定義が再帰的だから、どうしてもループには出来ないや。
末尾再帰も無理っぽい。
結局、let (let*) で途中経過をまとめるぐらいしかできないよ。こまった。
606:デフォルトの名無しさん
05/07/23 00:19:22
これ定義どおり実装するなら幼稚園児向けの問題で面白くもなんともないじゃん。
おまいら小学生ならもっと頭を使おうぜ。w
607:デフォルトの名無しさん
05/07/23 00:19:34
(define (pow2 x n)
(let loop ((x x) (n n) (r 1))
(if (= n 0) r
(loop (* x x) (quotient n 2) (if (even? n) r (* r x))))))
608:デフォルトの名無しさん
05/07/23 00:33:24
>>607
きれいだけど、定義から離れすぎてない?
漏れの頭では、>>589 の定義からは、これを自明には導き出せない…。
609:デフォルトの名無しさん
05/07/23 00:47:05
>>607 が >>589 の定義と同値かどうかは興味深い問題だね。
"1" が "×" の単位元でない場合とか "×" が可換でない
場合とかを考えるとちゃんとした証明が必要かも。
610:デフォルトの名無しさん
05/07/23 01:58:59
(define (pow2 x n) (apply * (vector->list (make-vector n x))))
611:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/07/23 02:53:57
なるほど、確かに
pow2(x * x, n) = pow2(x, n) * pow2(x, n) は自明ではないな。
614:デフォルトの名無しさん
05/07/23 03:24:59
(define pow2 expt)
615:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/07/23 05:11:48
>>615
数学的帰納法を使ったら pow2 の一般項 =x^n だって証明できてしまうと思われ。
そもそも関数の再帰的定義とは数学的帰納法を機械にやらせることなのに、
それを人間がやってしまったら本末転倒ではないかと。
617:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/07/24 19:52:58
でもってexptを高速化する手法の一つが今回の問題だったんでないかい?
620:デフォルトの名無しさん
05/07/24 20:17:31
ヒント:exptは浮動小数でも(略)
621:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/07/25 08:43:33
>>621
ふが〜 おれ (expt 2 128) とかがEXACT INTEGERで正確に得られることを期待してコード書いてたけど、これ処理系依存になっちまうのか....いたいぜ。
623:デフォルトの名無しさん
05/07/25 08:53:40
>>620
意味不明。(略)が(おれは無知です)の意味ならどうでもいいけど。
624:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/07/25 10:30:53
>>624 THX!
626:デフォルトの名無しさん
05/07/25 17:31:11
エキスパートシステムで、たとえば「stop」と入力した場合、
強制終了させるにはどうしたらいいんですか?
627:デフォルトの名無しさん
05/07/25 17:32:57
「stop」と入力されたときに強制終了すれば良いと思う。
628:デフォルトの名無しさん
05/07/25 17:37:21
>>627
強制終了の仕方を教えてください
629:デフォルトの名無しさん
05/07/25 18:03:19
>>628 期待した答えが返って来ないときは、質問のしかたが
間違ってる可能性が高いよ。
開発者なら、どういう言語のどういう処理系を使っていて、
どういう風に大域脱出したいのかを説明しないと。
けど、その前に近くにいる人に聞きなさい。それができない
なら電源をいきなり切ってボスに辞表を叩きつければ、仕事を
強制終了できるよ。
630:デフォルトの名無しさん
05/07/25 20:12:54
人生を強s(ry
631:デフォルトの名無しさん
05/07/25 20:15:08
人生を強すぎる精神力で乗り切る。
632:デフォルトの名無しさん
05/07/26 23:14:30
>>623
exptは浮動小数でも動くから、pow2がexptを高速化するという命題は
常に成り立たないということだよカス。
633:デフォルトの名無しさん
05/07/27 01:54:37
ところでpow2って掛け算の回数最小になるんだろうか?
証明できるor反例ある?
634:デフォルトの名無しさん
05/07/27 02:15:48
3つ以上の項を一度に乗算する命令でも想定しない限りは自明だろう。
それくらい瞬間的にわからないというのはちょっとヤバイのでは。
pow2(x, n)=x^nについて考える。末端リーフがn個の二分木を考えてみろ。
二分木で高さが最小になるのはなるべく均等な木のときであることはわかるだろう。
その二分木の高さイコール乗算の回数だ。
635:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/07/27 13:21:00
いきなり横レスですみません、超初心者です。こことSICPのスレは
とても勉強になるので感謝してます。上のアイデアというか原理は
たとえば 3^20 = (3^4)^5 = ((3^2)^2)^(2*2+1) で5回って意味でしょうか?
……うぅぅ凄すぎて式が追えないorz
639:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/07/27 23:36:31
s/順番が前後するが/話が前後するが/
641:デフォルトの名無しさん
05/07/28 00:25:58
あほ
642:デフォルトの名無しさん
05/07/28 22:57:26
>>632
最初からそう書けよ。
相手する価値もないヤシだってすぐわかるからさ。
643:638
05/07/29 04:53:54
>>639 レスありがとうございます。やっと SICP の1.2.4節に辿り着きました
URLリンク(mitpress.mit.edu)
後半の改善策が >>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:デフォルトの名無しさん
05/07/29 23:03:59
age
645:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/08/08 18:28:54
どっかの宿題?
648:デフォルトの名無しさん
05/08/08 18:34:19
いいえ、思いつきです。。
ちなみに25過ぎのおっさんですよ。。
649:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/08/08 21:04:45
むっ! Pythonのトランスレータを書こうとしているな。
653:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/08/08 21:59:58
a
b
c
d
dd
ee
e
f
g
h
i
j
k
とかなってたらeeはどうするのか? ということを考えると
>ddみたいな数階層上のインデントがあっても直前の階層の1つ上とみなす。
はよろしくないんじゃないかな。それとも構文エラー?
655:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/08/08 22:18:33
>>654
上にも書いたけど、それさっき気づきました。
やっぱ インデント構造はそのまま保持して、
後から遊びを修正するようにした方が利口かもしれない。
657:デフォルトの名無しさん
05/08/08 22:37:15
あー、>>654の場合は構文エラーというのも悪くないですね。
「ぶら下がる親があいまい」とかで。
様式的に654の様なケースはありえなさそうだし。
658:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/08/10 23:16:41
URLリンク(fun.sci.fukuoka-u.ac.jp)
のscheme-modeをgaucheのgoshをインタプリタとして使ってみたいのですが、
そういう使い方してる人います?
できれば教えて下さい。
またこれ以外でも、xyzzyで使えるscheme-modeがあれば紹介してください。
662:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/08/11 01:08:58
お約束キタ━━━(゚∀゚)━━━!!!
665:デフォルトの名無しさん
05/08/11 01:30:32
おおぅ、こんなところに誤爆してたのか orz
666:デフォルトの名無しさん
05/08/11 23:41:25
>>661
どっかでgoshの-iオプションを使うとか聞いたことがあるようなないような。
667:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/08/21 22:40:48
Schemeのコンパイラなどで使うというCPSについてわかりやすく
解説してるページはありますか?
コンパイラとかの中間言語としてのCPSとか、CPSへ/からの変換が
知りたいといいますか。英語でもいいです。
継続とは何ぞやとか、
普通の場合に戻ってから実行する処理をクロージャとして渡せば
一般の言語で継続渡し形式で書ける、という程度の継続渡しの
理解はしてるつもりです。
670:デフォルトの名無しさん
05/08/21 23:13:14
>>669
とりあえずSICP嫁。英語ならWebで読める。
671:デフォルトの名無しさん
05/08/21 23:37:09
SICPは読みかけの途中で止まってます。どのへんに書いてありますか?
672:デフォルトの名無しさん
05/08/21 23:44:38
あとは、東大のコンパイラ演習のレジュメとか
URLリンク(www.is.s.u-tokyo.ac.jp)
673:デフォルトの名無しさん
05/08/22 00:11:36
Scheme用のRSS解析ライブラリってないの?
perlのXML::RSSみたいなの.
674:デフォルトの名無しさん
05/08/22 00:38:14
SXMLとSXPATHでは足りない?
675:643
05/08/22 00:47:55
よりらくちんにやりたいのです.
676:デフォルトの名無しさん
05/08/22 02:56:42
>>673
LISPはクローズドな開発が多いから
ここで「〜ない?」系の質問しても答えはほとんど「無い」が返ってくると思っていい。
どうしても必要なら自分で書け。
そしてコミュニティに還元しろ。
677:643
05/08/22 09:31:13
>>676
なるほど!
じゃあ,がんばって書くよ.
678:デフォルトの名無しさん
05/08/22 10:58:41
LISPだと簡単に書けちゃうから、逆にあまり再利用を考えずに自分専用のを
作って使い捨てしちゃうってことはあるね。
>>677 がんがれ
679:デフォルトの名無しさん
05/08/30 13:54:52
Lisp に少し興味を感じています。
あまりにも他の言語と異質な感じをうけるため、心理的な抵抗感も実はあります。
Scheme は Lisp の派生あるいは方言である、と入門サイトに記述されています。
両言語の特性の違いについて、実際にプログラムを組んでいる方の感覚とご理解から
意見を伺いたいです。Lispが優れている言語ならば、それをもとにしたSchemeを
学習する方が良いのだろうか、と悩んでいます。
経済的な理由からLinuxマシンを新規に構成するのではなく、現在使用中の
Windowsマシンで Lisp/Scheme を学びたいと思っています。
680:デフォルトの名無しさん
05/08/30 19:51:41
>>679
CommonLispならcoLinux(ただしXP/2000限定)を入れてcmucl、
Windows単体で動かしたいならclisp使うとか。
Schemeなら日本語リソースではgauche、
とにかく速いのがいいならbiglooかな。
681:デフォルトの名無しさん
05/08/30 20:01:43
お勉強目的なら xyzzy でいいんじゃね?
エディタとしてもよく出来てるし。
682:デフォルトの名無しさん
05/08/30 20:07:21
>>681
xyzzyはかなり方言だし、ちゃんとしたclispあたりのほうが良いと思う。
Scheme系ならgaucheかな。
683:デフォルトの名無しさん
05/08/30 21:34:10
>>680 >>681 >>682
皆様のおかげで、5つの実装・環境について特徴を知ることができました。
奥深いのですね。ありがとうございます。
調べたところ、エディタ xyzzy には熱心な愛好者が多そうですね。
Lispの言語としての魅力と関係があるように印象を受けました。
お勧めのgaucheを少し検索しました。
Kahuaというウェブアプリケーション作成の仕組みがあるとか・・
時間をつくってお勧めを参考に Lisp/Scheme を勉強してみます。
684:デフォルトの名無しさん
05/08/30 21:52:14
>>683
あんまし色々言うと混乱させてしまうかもしれないけれど、
とりあえず動かしたいということだったら IDE もついてくる PLT Scheme が楽かも。
xyzzy がとっつきやすいのと同じ理由で。
一応日本語方面も外国ものとしてはそれなりだし。
でも、教科書とにらめっこして勉強するんじゃなく、
実際自分で使う小物スクリプトを色々書きながら勉強するというスタンスだったら
gauche が一番向いてるのかな。
そもそもスクリプティングに使いやすいものを、という開発方針だった気がするし。
何にせよ、Scheme は善かれ悪しかれ処理系ごとの個性が強いので
色々な処理系を試してみて、一旦これ、と決めたら、
それの使い方を詳しくつっこんでみるのがいいと思う。
685:デフォルトの名無しさん
05/08/30 22:35:37
結局、Schemeはスマートだけどライブラリが不足している現状があり、
それが処理系ごとの違いに繋がってるんだと思う。
Gaucheくらい充実してればSchemeも楽しい。
686:デフォルトの名無しさん
05/08/30 23:14:12
日本語を扱いに長けているcommon lispの処理系には何がありますか?
schemeだったらgaucheで決まりなんだけど、common lispは良さそうなのが
見当たりません。
687:デフォルトの名無しさん
05/08/30 23:20:45
>>686
最近のclispはSJIS/JIS/EUC/Unicode自由自在だよ。
URLリンク(clisp.cons.org)
688:デフォルトの名無しさん
05/08/31 00:12:43
Petite Chez Scheme というのを ChezEdit-NT というエディタで動作させるのも楽しそう。
689:デフォルトの名無しさん
05/09/01 13:15:57
スレ違いならすんませんが、Scheme勉強しようと思って、
OSX TigerにGauche 0.8.5インストールしたところリンクが通らず、
Finkでdlcompat入れろつーことらしいから(10.2だけど)、
Fink入れてみたんだけどdlcompatとかなさそうで、
ほんじゃってんで、ports入れてみて、
dlcompat落としてみたら、コンパイルできんって感じでげす...orz
どげにしたらインストでけるんでがしょ?
690:デフォルトの名無しさん
05/09/01 13:35:34
しかるべき場所でちゃんとした言葉遣いで相談したほうが良いと思います。
691:デフォルトの名無しさん
05/09/01 14:06:18
port install gauche
692:デフォルトの名無しさん
05/09/01 21:30:54
gaucheの特徴
・define-macroがある
・マニュアルが日本語(ライブラリも)
・ライブラリが豊富
・Cで簡単に拡張できる。
693:デフォルトの名無しさん
05/09/02 04:52:45
>>686
SBCL は最近、日本語通る様になった
694:686
05/09/03 01:42:43
>>687>>693
おまいら、ありがとうございます。
>>950は次スレのテンプレに日本語使える処理系情報を追加しておくように。
695:デフォルトの名無しさん
05/09/03 05:56:43
gaucheでhttpクライアントを作ろうとしています。
このとき http-get 関数に :Accept-Encoding "gzip, compress" を
指定して圧縮されて受け取ったデータを展開するにはどうすればよいでしょうか?
javaみたいにgzipのストリームがあれば便利なんですが、ストリームどころか
素のgzipのユーティリティも見当たらないようです。
知ってる方お知恵をお貸し下さい、おながいします。
696:デフォルトの名無しさん
05/09/03 16:34:33
とりあえず何とかしたいなら、プロセスポートを
使ってgzipを呼ぶようにすれば?
rfc.mimeも使うよね。
697:デフォルトの名無しさん
05/09/03 23:19:40
URLリンク(www.rubyist.net)
Paul Grahamが(言わなきゃいいのに)本音を漏らしちゃった話。
言語デザイナーとしての限界とか、無理して作るなとか、さんざんなこと言われてる。
698:デフォルトの名無しさん
05/09/03 23:57:02
>>697
個人的にはPaulの意見は理解できる。つーか、Matz僻みすぎ。
699:デフォルトの名無しさん
05/09/04 00:00:15
やっぱLISPは完成度が高すぎるんだな。
Paul一人ごときが進化できる代物ではないと。
Guyぐらいの天才でもないと。
700:デフォルトの名無しさん
05/09/04 02:06:14
たしかに完成度は高いのかもしれんが、
抽象度の高いものは、漏れのような頭の悪い奴らにとっては使いこなすのが難しいわけで。
そういう意味で、Perl, Python, Rubyのような言語ってのは、脳味噌が一部不自由でもLispの
パワーの片鱗に触れられるって点で意味はあると思うんだけどな。
で、より毛深くなりたくなったら、Lisp/Schemeの世界に足を踏み入れればよいのだし。
結局のところ動的言語使いはLispに始まりLispに帰るのか。
701:デフォルトの名無しさん
05/09/04 02:15:22
比較的簡単な問題をちょいちょいっと手続き型で書いていく時は、LispよりPythonの方が便利だと思う。
公式ライブラリが豊富なのもこの長所を延ばしてる。
Perlはawkの改良として、歴史的意味があった。
Rubyは...えーっと...
702:デフォルトの名無しさん
05/09/04 04:10:30
arc は Vaperware への道をまっしぐら感が強いよなあ。
>>695
wiliki の方でも訊いてみてはどうでしょ。
>>696 みたいな感じの答えになりそうな気はするけれど、
具体的なコードも出してくれるかも知れんし。
703:デフォルトの名無しさん
05/09/04 04:53:54
Arc も、もう少し志を低くして
(asdf-install:install 'arc)
で使える便利ライブラリ、くらいにするといいんだよ。
704:デフォルトの名無しさん
05/09/04 07:30:26
Haskell ,Clean 等は効率的で、LISP, SCHEME は万能である。
万能とは、科学者にとって悲しむべき特性である。
705:デフォルトの名無しさん
05/09/04 11:24:03
とはいえLispも今までいろいろ進化してきたしな。
これで完成だとか言ってると危ないかも。
706:デフォルトの名無しさん
05/09/04 11:25:21
そういえば、LISPでも関数を特別視してるけど、
それをなくしたら新しい文化ができるかも。
つまり、関数呼び出しは全てfancall, applyを使う。
707:デフォルトの名無しさん
05/09/04 12:16:58
funcall も apply も関数ですが
ていうか scheme では既に特別視してないし
708:デフォルトの名無しさん
05/09/04 13:01:47
じゃあ、定理証明系見たいなノリでmacroで作ったやつをmapできたりさせよう。
709:デフォルトの名無しさん
05/09/04 13:09:09
他の言語なら適当な文法考えるだけでなにか
新しいものを追加した気分になれるがlispだと
そんなのマクロで書けるじゃんでほとんど終わる
ので圧倒的に不利なきがする
710:デフォルトの名無しさん
05/09/04 13:15:42
個人的には理論的純粋さよりも実用性だな。ライブラリがあればいい。
ANSI Common Lisp + ネットワーク + 国際化 + XML + ...
みたいなノリで CLtL3 を作って標準化してほしい。
711:デフォルトの名無しさん
05/09/04 18:55:28
LISPは記号処理は得意でも文字列操作はそれほどでもない中途半端さがない?
712:デフォルトの名無しさん
05/09/04 19:29:12
>>711
EmacsLispはいかがですか?(反則ぎみ)
つか、欲しかったら時分でマクロなり関数なり定義してけばOK。
ソースある処理系だったら実装言語で拡張しちゃえば最強。
713:デフォルトの名無しさん
05/09/04 19:53:44
一度SchemeやCommon Lisp使っちゃうと、elispでごりごり書くなんて事実上ありえん。
それならPerl使った方がマシ。
714:デフォルトの名無しさん
05/09/04 22:23:55
Common Lisp だとリーダマクロなんて最後の武器があるしなあ。
#/regexp/ みたいなものくらいなら片手間で実装できるし。
まあ regexp 自体は既存のライブラリ使うとしてだけど。
xml を直接埋め込むようなライブラリとかもあったよね。
あとはファーストクラスの動的マクロとかの黒魔術に手を染めるしかないかもなあ。
Graham は確かオプションで切り替えられるような機能を
arc でサポートする予定だったと思ったけれど。
洒落だったら後置記法の Sexpr とか思いつくんだけどなあ。
715:デフォルトの名無しさん
05/09/04 22:36:29
>>714
>後置記法
括弧つきFORTHだな。w
716:デフォルトの名無しさん
05/09/05 07:20:19
>>713
emacs の開発者やコード寄贈者には Scheme や Common Lisp ハッカーが
ごろごろいるけど。
717:デフォルトの名無しさん
05/09/05 23:59:51
(>>713 emacsは絶対けなしちゃ駄目!!(><))
↓以下別の話題
718:デフォルトの名無しさん
05/09/06 01:47:11
個人的にここがお気に入り
スレリンク(tech板)
719:デフォルトの名無しさん
05/09/06 04:50:31
荒れるからやめろ。
↓以下Lispの話題
720:デフォルトの名無しさん
05/09/06 11:46:48
LISPって夢があっていいけど
ライブラリを充実させてほしい。
どんなしょぼLISPでも使えるネットワーク系ライブラリとかよ。
721:デフォルトの名無しさん
05/09/06 14:16:24
Generaがナツカシス。
ああいう開発環境をいまの技術で作れば、めちゃ快適なんだろうなと夢想。
722:デフォルトの名無しさん
05/09/06 18:33:08
>>720
ほんとそのとおりだよ。LISPerにはライブラリ共有の概念がないのかね。
723:デフォルトの名無しさん
05/09/06 19:30:23
URLリンク(www.cliki.net)
724:デフォルトの名無しさん
05/09/06 21:32:59
偉そうなこと言うやつはいるけど。
それ以外の日本語のコンテンツの少なさは凄いよな。
725:デフォルトの名無しさん
05/09/06 21:40:16
↑偉そうなこと言うやつ
726:デフォルトの名無しさん
05/09/06 22:06:11
>>724
探せばそれなりにはあるよ。大学なり個人なり。
Java とかに比べれば、そりゃ少ないけど。
↓はテンプレに入れても良いかも。
チュートリアル
URLリンク(www.h7.dion.ne.jp)
ティップス
URLリンク(www.geocities.co.jp)
727:デフォルトの名無しさん
05/09/06 22:31:27
偉そうなこと言う奴は、確かに充実してる(多い)な
728:デフォルトの名無しさん
05/09/06 23:37:41
なんだ、宿題教えてもらえなかったのか
729:デフォルトの名無しさん
05/09/07 22:26:23
初心者用のコンテンツのみ充実してるな。
730:デフォルトの名無しさん
05/09/08 18:36:51
しかし、初心者自体は足りてないと
731:デフォルトの名無しさん
05/09/10 12:21:47
さっきうっかり chez のサイト踏んだら chez scheme が
version 7 に上がってたんで一応貼っておきますね。
リリースノートを眺めた限りではあんまり派手な変更はなさそうですけれど。
多言語方面に対応しないのはお客さんから要望が出ないからなんだろうなあ。
URLリンク(www.scheme.com)
732:デフォルトの名無しさん
05/09/12 03:15:04
>>731
値段が判りませぬ。幾らなんでしょうかご存じでしょうか。サイト探してみたんですけど
見当たらなかったように思います。
733:デフォルトの名無しさん
05/09/12 04:00:26
>>732
フリーで機能限定版(コンパイラが無い)の Petite Chez があります。
Chez 自体の値段は私も知りませんが ACL といい勝負だという噂は聞いたことがあります。
基本的に個人相手に商売してるんじゃなさそうな気がします。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5279日前に更新/268 KB
担当:undef