关于SCIP中的无穷流,谢谢
3.5.2节无穷流开头有个关于整数的定义,我写了一下程序,想打印出第一个整数,但是结果进入了死循环,应该是程序有问题,请问哪个地方有错,谢谢
(define (cons-stream a b)
(define (delay x)
(lambda () x))
(cons a (delay b)))
(define (intergers-starting-from n)
(cons-stream n (intergers-starting-from (+ n 1))))
(define (integers) (intergers-starting-from 1))
(define (show x)
(define (display-line x)
(display x)
(newline))
(display-line x))
(define (stream-car stream)
(car stream))
(show (stream-car (integers)))
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
(居然能上网,抓紧机会上来换口气 )
之后还有个 stream-cdr,是个带 force 的,与 cdr 不同;但 stream-car 与 car 是一样的。
[ 本帖最后由 win_hate 于 2008-11-23 21:52 编辑 ]
偶像。。。 我懂了 3Q
复制代码
这样不行的,区别在于一个是用 define 定义的,另一个是用 define-syntax 定义的。用 define 得到的是函数,所以这样构造的 cons-stream 会对参数 a, b 进行求值,之后再把 cons-stream 应用上去。
比如 (cons-stream 1 (+ 2 3)),scheme 会这样做 => (cons-stream 1 5) => (cons 1 (delay 5)) => 1 . promise
但用 define-syntax 得到的是宏,展开宏的时候不会对参数求值
(cons-stream 1 (+ 2 3)) => (cons 1 (delay (+ 2 3)) = 1 . promise
[ 本帖最后由 win_hate 于 2008-11-22 10:23 编辑 ]
也就是说如果把cons-stream定义成如下所示
(syntax-rules ()
((_ x) (lambda () x))))
(define (cons-stream a b)
(cons a (delay b)))
(define (intergers-starting-from n)
(cons-stream n (intergers-starting-from (+ n 1))))
(cons x y) 是严格求值的,会先求出 x, y 的值,然后把 cons 作用在上面。所以你说书本上的 interger-staring-from.... 会得到无限循环。
(cons-stream x y) 中的 cons-stream 是个宏,或特殊形式。它并不对 x, y 求值,而是把表达式转换成 (cons x (delay y)),之后按 cons 的方式严格求值。由于原来的 y 被替换成 (dealy y),这样惰性就体现出来了。
[ 本帖最后由 win_hate 于 2008-11-22 09:37 编辑 ]
因为cons 的参数可以为过程,eg: (cons 'a (lambda () (* x x))
所以我觉得无论b是什么形式(过程或值),cons 和 cons-stream的语义应该是一样的.
不知道改成那样的意义是什么
3Q
你的 cons-stream 的定义方式
复制代码
跟 cons 没有区别。按书本中 cons-stream 的语义,可以这样定义
复制代码
谢谢,问题基本解决:wink:
是delay 函数的问题,还是那个 " “山寨版” 的 delay " 好用
改了一下以后,就好了:wink:
不过我觉得好像书上对于 intergers-starting-from n 的定义也有点问题
书上为:
(cons-stream n (intergers-starting-from (+ n 1))))
http://bbs3.chinaunix.net/thread-1306739-1-1.html
看看这个,也许有帮助。