[Gauche-devel-jp] fault on continuation

Back to archive index

Tetsuya Okada okaya****@c-cre*****
2002年 11月 18日 (月) 15:22:44 JST


はじめまして。岡田と申します。
1ヶ月ほど前から Gauche で遊んでいます。

継続を使ってバックトラックするプログラムを書いていまして、以下のような
ベンチマークを作ったのですが Gauche 0.6.5 が segmentation fault してい
まいます。RedHat Linux 7.2 と Windows XP SP1 Cygwin の両方で再現しまし
た。Linux 用はバイナリの RPM を持ってきたもの。Cygwin のほうは自分で
gcc 2.95.3 でコンパイルしたもの(gcc 3.2 だと uvector がエラーになるた
め)です。

下から2行目の 10000 (繰り返し回数)を1にするとちゃんと動きます。

ちなみに他の処理系での結果は以下のような感じでした。(Athlon 1.2GHz)

  Chicken compiler (-O3):   0.09 秒
  Chicken interpreter:      0.72 秒
  SCM:                      5.51 秒
  guile:                   38.38 秒
  Petite Chez Scheme        0.29 秒

処理系によって、得手不得手が極端に現れますね。

---------------------- cont-bench.scm
(define *backtrack* '())

(define (choice s)
  (if (null? s)
      (fail)
      (if (call-with-current-continuation
	   (lambda (cont)
	     (set! *backtrack* (cons cont *backtrack*))
	     #t))
	  (car s)
	  (choice (cdr s))))) ;; tail rec

(define (fail)
  (let ((c (car *backtrack*)))
    (set! *backtrack* (cdr *backtrack*))
    (c #f)))

(define (cont-test)
  (let ((n 0))
    (call-with-current-continuation
     (lambda (cont)
       (set! *backtrack* (list cont))
       (let ((a (choice '("He" "She" "This")))
	     (b (choice '("boy" "girl" "pen"))))
	 ;;(display (string-append a " is a " b "."))
	 ;;(newline)
	 (set! n (+ n 1))
	 (fail))))
    n))

(begin
  (write (do ((i 0 (+ i 1))
	      (n 0 (+ n (cont-test))))
	     ((>= i 10000) n)))
  (newline))
----------------------

--
Tetsuya Okada
Computer Creators, Inc.



Gauche-devel-jp メーリングリストの案内
Back to archive index