Comment detail

アルファベットの繰り上がり (Nested Flatten)
gaucheでstream版です。
私が未熟なため、streamをflattenするのに苦労しました。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
(use util.stream)

(define (stream-appendx x)
  (cond ((stream-null? x) (stream-delay ()))
        ((stream? (stream-car x)) (stream-append (stream-car x) (stream-delay (stream-appendx (stream-cdr x)))))
        (else x)))

(define (stream-iota-n . rest)
  (stream-appendx
    (stream-map
      (if (null? (cdr rest))
        list
        (lambda (x)
          (stream-map
            (lambda (y) (cons x y))
            (apply stream-iota-n (cdr rest)))))
      (stream-iota (car rest)))))

(define (i->alpha c)
  (apply string (map (lambda (x) (integer->char (+ 65 x))) c)))

(print (stream->list (stream-take (stream-map i->alpha (stream-iota-n 26 26)) 100)))
streamのstreamになってるんですね。これはややこしい。
でもその必要はあるのかなあ?

結果がちょっと違うようです。最初の26個は一桁じゃないとならない。
あい、仰るとおり、必要ないです。
もう、途中から意地になってやってました。orz
やりなおしました。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
(define (stream-iota* . rest)
  (define (countup s l v)
    (if (null? v)
      ()
      (let1 vn (countup (cdr s) (cdr l) (cdr v))
        (cond ((null? vn) (list (+ 1 (car v))))
              ((= (car l) (car vn)) (cons* (+ 1 (car v)) 0 (cdr vn)))
              (else (cons (car v) vn))))))
  (let* ((start (map car rest))
         (lim (map cadr rest)))
    (let loop ((v start))
        (stream-cons v (stream-delay (loop (countup start lim v)))))))

(define i->char (compose integer->char (pa$ + 65)))

(print (stream->list
         (stream-take
           (stream-map
             (compose (apply$ string)
                      (map$ i->char)
                      (remove$ negative?))
             (stream-iota* '(-1 26) '(0 26))) 100)))

Index

Feed

Other

Link

Pathtraq

loading...