Comment detail

tailの実装 (Nested Flatten)

愚直にキューをつかって。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
(use gauche.parseopt)
(use gauche.selector)
(use util.queue)

(define (main args)
  (let-args (cdr args)
      ((nlines "n=n" 10)
       (f? "f" #f)
       . argv)
    (call-with-input-file (car argv)
      (lambda (iport)
        (let ((q (make-queue)))
          (let loop ((n 0)
                     (line (read-line iport)))
            (unless (or (= n nlines) (eof-object? line))
              (enqueue! q line)
              (loop (+ n 1) (read-line iport))))
          (do ((line (read-line iport) (read-line iport)))
              ((eof-object? line))
            (enqueue! q line)
            (dequeue! q))
          (for-each print (queue->list q)))
        (when f?
          (with-signal-handlers ((SIGINT => (lambda _ (exit 0))))
            (lambda ()
              (let ((sel (make <selector>)))
                (selector-add! sel
                               iport
                               (lambda (input _)
                                 (and-let* ((line (read-line input))
                                            ((not (eof-object? line))))
                                   (print line))
                                 (sys-sleep 1))
                               '(r))
                (while #t (selector-select sel))))))
        0))))

Index

Feed

Other

Link

Pathtraq

loading...