Scheme SICP cons流
关于SICP 3.5 我自己的实现如下Scheme SICP cons流,scheme,sicp,cons,Scheme,Sicp,Cons,关于SICP 3.5 我自己的实现如下 (define (delay exp) (lambda () exp)) (define (force delayed-obj) (delayed-obj)) (define (cons-stream a b) (cons a (delay b))) (define (stream-car stream) (car stream)) (define (stream-cdr stream) (force (cdr stream))) (def
(define (delay exp) (lambda () exp))
(define (force delayed-obj)
(delayed-obj))
(define (cons-stream a b) (cons a (delay b)))
(define (stream-car stream) (car stream))
(define (stream-cdr stream) (force (cdr stream)))
(define (take n stream)
(if (= n 0)
(print "0")
(begin (take (- n 1) (stream-cdr stream))
(print n))))
(define (make-stream-enum-interval low high)
(if (> low high)
'()
(begin (print low) (cons-stream low (make-stream-enum-interval (+ low 1) high)))))
事实上我发现它并没有真正延迟。
执行时(定义范围-10-100(使流枚举间隔10-100))。我希望控制台中只打印10个。而现在是10…100
我的代码有什么问题吗?
或者,如果打印10…100是必要的,那么我们可以说结构是
(c)第10条(延迟)
第11条(延迟)
cons 12(延期)
....100)))
如果是这样,那么我们需要更多的内存。方案使用。这意味着函数调用的所有参数都在函数输入之前进行求值。因此,由于您的delay
是一个函数,因此传递给delay
的表达式首先求值
要解决此问题,请将delay
设置为宏,使用它的任何操作(如cons-stream
)也一样。以下是将delay
和cons-stream
重新设置为宏:
(define-syntax delay
(syntax-rules ()
((_ exp) (lambda () exp))))
(define-syntax cons-stream
(syntax-rules ()
((_ a b) (cons a (delay b)))))
您还可以使用lips宏
(定义宏(delay.exp)`(lambda(),@exp))