Promises

delay and make-promise

test/delay-and-make-promise: pass

(define (test/delay-and-make-promise _)
  (let* ((count (let1 (counter 0)
                      (λ () (set! counter (add1 counter)) counter)))
         (delayed_count (delay (count))))
    (⊦= 1 (force delayed_count))
    (⊦= 1 (force delayed_count))
    (⊦= 1 (force delayed_count))
    (⊦= 1 (force delayed_count))
    (⊦= 1 (force delayed_count))
    (let1 (promised_count (make-promise (count)))
          (⊦= 2 (force promised_count))
          (⊦= 2 (force promised_count))
          (let1 (promised_ccount (make-promise (count)))
                (⊦= 2 (force promised_count))
                (⊦= 3 (force promised_ccount))
                (⊦= 4 (count))))))
((eta 0.0) (memory #(6291456 1866032 1048576)) (stdout "") (stderr ""))

test/promise?: pass

(define (test/promise? _)
  (⊨ (promise? (delay (+ 3 4))))
  (⊨ (promise? (delay-force (+ 3 4)))))
((eta 0.0) (memory #(6291456 1867224 1048576)) (stdout "") (stderr ""))

test/delay-force-filter: pass

(define (test/delay-force-filter _)
  (letrec ((stream-filter/tailcall
             (λ (p? s)
                (delay-force
                  (let1 (s-mature (force s))
                        (if (null? s-mature)
                          (delay '())
                          (let-values
                            (((h t) (car+cdr s-mature)))
                            (if (p? h)
                              (delay (cons h (stream-filter/tailcall p? t)))
                              (stream-filter/tailcall p? t))))))))
           (stream-filter/stackfull
             (λ (p? s)
                (delay (force (let1 (s-mature (force s))
                                    (if (null? s-mature)
                                      (delay '())
                                      (let-values
                                        (((h t) (car+cdr s-mature)))
                                        (if (p? h)
                                          (delay (cons h (stream-filter/stackfull p? t)))
                                          (stream-filter/stackfull p? t)))))))))
           (from (λ (n) (delay-force (cons n (from (+ n 1))))))
           (large-number 10000))
    (⊦= large-number
        (car (force (stream-filter/tailcall
                      (λ (n) (= n large-number))
                      (from 0)))))))
((eta 0.031) (memory #(6291456 1869432 1048576)) (stdout "") (stderr ""))

test/force-non-promises: pass

(define (test/force-non-promises _)
  (⊨ (procedure? (force (τ 3))))
  (⊦= '3 (force (make-promise 3))))
((eta 0.0) (memory #(6291456 1870696 1048576)) (stdout "") (stderr ""))