■
「http://www.yotabanana.com/lab/20060120.html#p01」の Ruby スクリプトを Scheme で書いたらどうなるか。ただの翻訳ではつまらないので、クロージャも取り混ぜてみる。
#!/usr/bin/env gosh ;; カウンタクロージャを保管する (define *counters* (make-hash-table 'string=?)) ;; ref に対応するカウンタクロージャを返すか、無ければつくる。 (define (get-counter ref) (or (hash-table-get *counters* ref #f) (let ((c (make-counter))) (hash-table-put! *counters* ref c) c))) ;; カウンタクロージャをつくる。評価されるたびに count をインクリメント。 (define (make-counter) (let ((count 0)) (lambda () (set! count (+ 1 count)) count))) ;; ref に対応するカウンタを評価して10以下なら許可 (define (allow? ref) (let ((c (get-counter ref))) (>= 10 (c)))) (define (test) (dotimes (i 10000) (dotimes (j 15) (allow? #`"http://www.hatena.ne.jp/,|i|") (allow? #`"http://yahoo.com/,|i|") (allow? #`"http://www.google.com/,|i|")))) (define (main args) (use gauche.time) (time (test)))