PasteRack.org
Paste # 84068
2015-05-19 22:34:14

Fork as a new paste.

Paste viewed 163 times.


Embed:

for/stream

  1. #lang racket
  2.  
  3. (require racket/control)
  4.  
  5. (define-syntaxes (for/stream for*/stream)
  6.   (let ()
  7.     (define ((make-for/stream derived) stx)
  8.       (syntax-case stx ()
  9.         [(_ clauses . body)
  10.          #`(let ()
  11.              (define (stream-loop element continue)
  12.                (if continue
  13.                    (stream-cons element
  14.                                 (call-with-values
  15.                                  (thunk (call/prompt continue))
  16.                                  stream-loop))
  17.                    element))
  18.              (call-with-values
  19.               (thunk
  20.                (prompt
  21.                 (#,derived
  22.                  #,stx () clauses
  23.                  (let/cc continue
  24.                    (abort (let () . body) continue)))
  25.                 (abort empty-stream #f)))
  26.               stream-loop))]))
  27.     (values (make-for/stream #'for/fold/derived)
  28.             (make-for/stream #'for*/fold/derived))))
  29.  
  30. (stream->list (for/stream ([i (in-list '(1 2 3 4))]) (* i i)))

=>

'(1 4 9 16)