On Stream in Scheme

(define (force delayed-object)
  (delayed-object))


(define (memo-proc proc)
  (let ((already-run? false) (result false))
    (lambda ()
      (if (not already-run?)
          (begin (set! result (proc))
                 (set! already-run? true)
                 result)
          result))))
;;(memo-proc (lambda () <exp>))
;;(delay <exp>)
;;is syntactic sugar for 
;;(lambda () <exp>)


(define-syntax cons-stream
  (lambda (x)
    (syntax-case x ()
      ((_ a b) (syntax (cons a (delay b)))))))


(define-syntax car-stream
  (lambda (x)
    (syntax-case x ()
      ((_ s) (syntax (car s))))))


(define-syntax cdr-stream
  (lambda (x)
    (syntax-case x ()
      ((_ s) (syntax (force (cdr s)))))))


(define (for-each-stream pred s)
  (pred (car-stream s))
  (for-each-stream pred (cdr-stream s)))


(define (show-money to s)
  (call/cc (lambda (end)
             (for-each-stream (lambda (m)
                                (if (> m to)
                                    (end m))
                                (display m)
                                (newline))
                              s))))


(define (money-tree n)
  (cons-stream n (money-tree (* n n))))


(define salary (money-tree 2))




(define (sieve stream)
  (cons-stream
   (stream-car stream)
   (sieve (stream-filter
           (lambda (x)
             (not (divisible? x (stream-car stream))))
           (stream-cdr stream)))))


(define primes (sieve (integers-starting-from 2)))


Now to find a particular prime we need only ask for it: 


(stream-ref primes 50)
233
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值