Gauche > Archives > 2011/01/19

2011/01/19 00:53:10 UTCとおる。
#
アメリカのスタバは short がないですもんね。逆に言えば、各カップのサイズの絶対量は世界共通なんでしょうかね?
2011/01/19 01:54:38 UTCenami
#
venti があるのを知ったのは去年秋にアメリカ出張したときでした。帰ってきてから日本のスタバにもあることを知った。
2011/01/19 03:06:45 UTCshiro
#
昨日、自力でfirefox立ち上げ→google→検索窓に数字入力、に到達したらむ太であるが、本日suggestionの力を借りてトムとジェリーの動画に到達する方法を覚えた。 ('t' 'o' 'm' 'u' まで入力するとsuggestionに出てくる) youtubeはきりがないので一回にひとつだけという約束だが私が見てないとどうなるかわからんな。
2011/01/19 03:09:45 UTC(び)
#
google画面にもどってイチからやり直す、というhack
#
それにしてもさすがに子供は進化が速いなぁ
2011/01/19 03:32:22 UTChigepon
#
すごいですね。うちの子は iPad で電車の動画をよく見ています。
#
まだ操作は偶然に頼っている部分があって確実ではないのだけど、再生履歴から動画を選んだり再生、停止などはもう理解している様子。
2011/01/19 04:57:30 UTCとおる。
#
そのうちターミナルで make と打つようになりそう。
2011/01/19 06:01:58 UTCeyasuyuki@twitter
#
リストAの中に、リストBの要素を(順番を保ったまま)ランダムな位置に挿入したリストCを得るには? (リストCの長さ=Aの長さ+Bの長さ)
2011/01/19 06:26:27 UTC(び)
#
(use math.mt-random)
(define-constant *mt* (make <mersenne-twister> :seed (sys-time)))
(define (random-zip ls1 ls2)
  (let loop ((ls1 ls1)
	     (ls2 ls2)
	     (result '()))
    (cond ((null? ls1) (append (reverse! result) ls2))
	  ((null? ls2) (append (reverse! result) ls1))
	  ((= 0 (mt-random-integer *mt* 2))
	   (loop (cdr ls1) ls2 (cons (car ls1) result)))
	  (else
	   (loop ls1 (cdr ls2) (cons (car ls2) result))))))
#
本当にランダムかは知らない ;-)
#
任意個のリストに対して同じことをするようにするのも難しくないと思うたぶん
2011/01/19 06:32:12 UTCRui
#
まんべんなく混ざっているというのがランダムということにすると
#
リストxを長さL(x)としたとき、先頭の要素をL(A)/(L(A)+L(B)+2)の確率でAの先頭から取る、さもなければBの先頭から取る
#
以下再帰
2011/01/19 06:33:54 UTC(び)
#
ふむ
2011/01/19 06:46:17 UTCとおる。
#
L(B) が 0 のとき、100% にならないですような。
#
あ、考えながら書いてたらへんなにほんご。。。
#
L(A)+2 個ある位置から、重複を許して、L(B) 個選ぶってことですよね。
2011/01/19 07:02:07 UTCRui
#
両端があるから+2と思ったんですがおかしいですね。単純にL(A)/(L(A)+L(B))でいいのか
2011/01/19 07:10:58 UTC(び)
#
(use math.mt-random)
(define-constant *mt* (make <mersenne-twister> :seed (sys-time)))
(define (choice ls1-len ls2-len)
  (let* ((total (+ ls1-len ls2-len))
	 (value (mt-random-integer *mt* total)))
    (if (< value ls1-len)
	0
	1)))
(define (random-zip ls1 ls2)
  (let loop ((ls1 ls1)
	     (ls2 ls2)
	     (result '()))
    (cond ((null? ls1) (append (reverse! result) ls2))
	  ((null? ls2) (append (reverse! result) ls1))
	  ((= 0 (choice (length ls1) (length ls2)))
	   (loop (cdr ls1) ls2 (cons (car ls1) result)))
	  (else
	   (loop ls1 (cdr ls2) (cons (car ls2) result))))))
#
なんも考えてない版
#
誰か賢いchoiceを実装して
2011/01/19 07:36:20 UTCeyasuyuki@twitter
#
(make-list (lenght B))をA'にappendしてshuffleしたものに手動でBを埋め込むという暴挙で乗りきりました<ぉ
2011/01/19 08:55:40 UTCとおる。
#
(use srfi-27)

(define (mixed-list-iter lis-a lis-b part)
  (if (null? lis-a)
      (append (reverse part) lis-b)
      (if (null? lis-b)
          (append (reverse part) lis-a)
          (if (let ((len-a (length lis-a))
                    (len-b (length lis-b)))
                (< (random-real) (/ len-a (+ len-a len-b))))
              (mixed-list-iter (cdr lis-a) lis-b (cons (car lis-a) part))
              (mixed-list-iter lis-a (cdr lis-b) (cons (car lis-b) part))))))
#
毎回 length やってるのは無駄ですけど。
#
(use srfi-27)

(define (random-zip-iter lis-a lis-b part)
  (if (null? lis-a)
      (append (reverse part) lis-b)
      (if (null? lis-b)
          (append (reverse part) lis-a)
          (if (let ((len-a (length lis-a))
                    (len-b (length lis-b)))
                (< (random-real) (/ len-a (+ len-a len-b))))
              (random-zip-iter (cdr lis-a) lis-b (cons (car lis-a) part))
              (random-zip-iter lis-a (cdr lis-b) (cons (car lis-b) part))))))

(define (random-zip lis-a lis-b)
  (random-zip-iter lis-a lis-b ()))
#
名前そろえました。
2011/01/19 09:03:52 UTCとおる。
#
(use srfi-27)

(define (random-zip lis-a lis-b)
  (define (random-zip-iter lis-a len-a lis-b len-b part)
    (if (null? lis-a)
        (append (reverse part) lis-b)
        (if (null? lis-b)
            (append (reverse part) lis-a)
            (if (< (random-real) (/ len-a (+ len-a len-b)))
                (random-zip-iter (cdr lis-a) (- len-a 1) lis-b len-b
                                 (cons (car lis-a) part))
                (random-zip-iter lis-a len-a (cdr lis-b) (- len-b 1)
                                 (cons (car lis-b) part))))))

  (let ((len-a (length lis-a))
        (len-b (length lis-b)))
    (random-zip-iter lis-a len-a lis-b len-b ())))
2011/01/19 09:05:07 UTC(び)
#
random-realの後ろの/って、/.じゃなくても大丈夫なんだっけ?
2011/01/19 09:05:42 UTCとおる。
#
比較演算子が文句言わないから大丈夫かなと思ったんですけど、どうでしょう?
2011/01/19 09:05:46 UTC(び)
#
<で暗黙の変換があるから平気か
2011/01/19 09:06:39 UTCshiro
#
比較は問題なし。一時的に有理数が作られるから効率はちょっぴり悪いけど。
2011/01/19 09:07:13 UTC(び)
#
そっか、math.mt-randomを直に使うより、この場合はsrfi-27使った方がすっきりするもんね。いっつもsrfi-27の存在を忘れてしまう。
2011/01/19 09:13:02 UTCshiro
#
math.mt-randomを直で使うのはmt-random-fill-f32vector!とか欲しい時だけだなあ。
2011/01/19 13:20:57 UTCshiro
#
多値の存在はcall/ccの定義に影響するのでコアに入れざるを得ないのでは RT: @dico_leque: scheme-reports-wg1 で、副作用目的の手続きの戻り値は (values) (値なし)にしよう、という意見が出ているけど、その流れで行くと多値はコアに入れるということになるんだろうか
2011/01/19 13:22:01 UTCtheoria
#
GaucheのJVM向けバックエンドを開発しようかと考えています。
2011/01/19 13:22:33 UTCshiro
#
ただ、値の数の不一致をチェックするのがMUSTになったら性能的にちょいと面倒だなあ。
2011/01/19 13:22:52 UTCtheoria
#
実際に始めるのは2-4週間後になるかと思いますが、その際にはいろいろ質問するかと思いますのでよろしくおねがいします>Shiro
2011/01/19 13:23:18 UTCshiro
#
おお、それはすごい>Gauche on JVM
2011/01/19 13:23:33 UTCtheoria
#
今考えているパターンとしてはpass3の差し替えか、Gauche-VMバイトコードをJVMバイトコードに変換するかのどちらかです。
#
あーでも、上司の承認が降りなかったらたちきえになっちゃいますけど……
#
一年ぐらいClojureを使っていろいろ書いてましたが、結局速度やメモリ使用量的にClojureが気に入らなくて開発しようかと思った次第です
#
というわけで、今日はごあいさつまで。失礼いたします。
2011/01/19 13:27:12 UTCshiro
#
Gauche VMのアーキテクチャはかなりC前提で設計されてるので、JVMに載せて思うような速度を出すのは難しいかもしれません。特に、Gaucheのランタイムはスタックをかなり自由に触ってますが、そのままJVMNに載せてもスタックを思うようにいじれないと思うので。
2011/01/19 13:55:51 UTChigepon
#
おもしろそうだ。
2011/01/19 14:03:02 UTCshiro
#
もう一度考えてみたら、コード生成パス (以前はpass3、今はpass5になってるけど) より前のパスについては$ASMを除けばGauche VMに特に依存してないなあ。それなら性能的にはコード生成だけバックエンドに合わせて切り替えるってのも無くはないか。
2011/01/19 19:54:08 UTCとおる。
#
おおお。Closure の弱みを知った上での開発というのは心強いですねー。