关于SCIP中的无穷流,谢谢

发布于 2022-08-11 22:58:36 字数 651 浏览 12 评论 9

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

倒带 2022-08-19 01:53:18

(居然能上网,抓紧机会上来换口气    )

之后还有个 stream-cdr,是个带 force 的,与 cdr 不同;但 stream-car 与 car 是一样的。

[ 本帖最后由 win_hate 于 2008-11-23 21:52 编辑 ]

放血 2022-08-19 01:49:53

偶像。。。 我懂了  3Q

戏舞 2022-08-18 23:38:11
  1. (define (cons-stream a b)
  2.   (cons a (delay b)))

复制代码

这样不行的,区别在于一个是用 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 编辑 ]

菊凝晚露 2022-08-18 22:19:05

也就是说如果把cons-stream定义成如下所示

(define-syntax delay
  (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))))

空心↖ 2022-08-18 11:28:36

(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 编辑 ]

慕烟庭风 2022-08-18 01:56:01

因为cons 的参数可以为过程,eg:  (cons 'a (lambda () (* x x))

所以我觉得无论b是什么形式(过程或值),cons 和  cons-stream的语义应该是一样的.

不知道改成那样的意义是什么

3Q

酒浓于脸红 2022-08-17 09:07:03

你的 cons-stream 的定义方式

  1. (define (cons-stream a b)
  2.   (cons a b))

复制代码

跟 cons 没有区别。按书本中 cons-stream 的语义,可以这样定义

  1. (define-syntax cons-stream
  2.   (syntax-rules ()
  3.     ((_ x y) (cons x (delay y)))))

复制代码

2022-08-17 00:04:21

谢谢,问题基本解决:wink:

是delay 函数的问题,还是那个 " “山寨版” 的 delay " 好用
改了一下以后,就好了:wink:  

不过我觉得好像书上对于 intergers-starting-from n 的定义也有点问题

书上为:

(define (intergers-starting-from n)
  (cons-stream n (intergers-starting-from (+ n 1))))

西瑶 2022-08-15 08:29:45

http://bbs3.chinaunix.net/thread-1306739-1-1.html

看看这个,也许有帮助。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文