PasteRack.org
Paste # 58740
2023-06-12 18:52:46

Fork as a new paste.

Paste viewed 849 times.


Embed:

Sequence experiments

  1. #lang racket
  2.  
  3. (require racket/generator)
  4.  
  5. ; Provide alternatives for sequence constructors.
  6. ;
  7. ; Define the sequence constructors before the struct
  8. ; so that the constructors are available for use in
  9. ; `#:property prop:sequence`.
  10. (define (in-myvec-stream a-myvec)
  11.   (define inner-vec (myvec-v a-myvec))
  12.   (for/stream ([index (in-range 0 (vector-length inner-vec))])
  13.     (define item (vector-ref inner-vec index))
  14.     ; Use `displayln` to verify that the sequence items
  15.     ; are created on-demand.
  16.     (displayln item)
  17.     item))
  18.  
  19. (define (in-myvec-generator a-myvec)
  20.   (define inner-vec (myvec-v a-myvec))
  21.   (in-generator
  22.     (for ([index (in-range 0 (vector-length inner-vec))])
  23.       (define item (vector-ref inner-vec index))
  24.       (displayln item)
  25.       (yield item))))
  26.  
  27. ; Pretend that this isn't a normal Racket vector,
  28. ; but something else internally, so that we need a
  29. ; custom sequence constructor.
  30. (struct myvec (v)
  31.   #:property prop:sequence
  32.   ; Or, alternatively, `in-myvec-gemerator`
  33.   in-myvec-stream)
  34.  
  35. (define (make-myvec . values)
  36.   (define a-vec (apply vector values))
  37.   (myvec a-vec))
  38.  
  39. (define (test a-myvec [sequence-constructor #f])
  40.   (define the-sequence
  41.     (if sequence-constructor
  42.         (sequence-constructor a-myvec)
  43.         ; Use the value itself as sequence.
  44.         a-myvec))
  45.   (displayln sequence-constructor)
  46.   (for/list ([unused (in-range 0 2)]
  47.              [vec-item the-sequence])
  48.     vec-item))
  49.  
  50. (define a-myvec (make-myvec 10 11 12 13))
  51.  
  52. (test a-myvec in-myvec-stream)
  53. (test a-myvec in-myvec-generator)
  54. (test a-myvec)

=>

#<procedure:in-myvec-stream>

10

11

'(10 11)

#<procedure:in-myvec-generator>

10

11

'(10 11)

#f

10

11

'(10 11)