免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5906 | 回复: 11
打印 上一主题 下一主题

关于SCIP中的无穷流,谢谢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-21 21:54 |只看该作者 |倒序浏览
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)))

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2008-11-21 22:57 |只看该作者
http://bbs3.chinaunix.net/thread-1306739-1-1.html

看看这个,也许有帮助。

论坛徽章:
0
3 [报告]
发表于 2008-11-21 23:51 |只看该作者
谢谢,问题基本解决:wink:

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

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

书上为:
(define (intergers-starting-from n)
  (cons-stream n (intergers-starting-from (+ n 1))))

这样(intergers-starting-from (+ n 1))会不停地递归地进行求值
改为下面这样就可以了~~
(define (intergers-starting-from n)
  (cons-stream n (delay (intergers-starting-from (+ n 1)))))

最终代码为:
(define-syntax delay
  (syntax-rules ()
    ((_ x) (lambda () x))))
(define (cons-stream a b)
  (cons a b))
(define (intergers-starting-from n)
  (cons-stream n (delay (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)))


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

论坛徽章:
0
4 [报告]
发表于 2008-11-22 01: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)))))
复制代码

论坛徽章:
0
5 [报告]
发表于 2008-11-22 08:01 |只看该作者

回复 #4 win_hate 的帖子

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

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

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

3Q

论坛徽章:
0
6 [报告]
发表于 2008-11-22 09:35 |只看该作者
(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 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2008-11-22 09:57 |只看该作者
也就是说如果把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))))


就可以了(书上关于integer的定义就是对的),但是我试了一下,还是会递归进行求值。

论坛徽章:
0
8 [报告]
发表于 2008-11-22 10:06 |只看该作者

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

论坛徽章:
0
9 [报告]
发表于 2008-11-22 10:14 |只看该作者
偶像。。。 我懂了  3Q

论坛徽章:
0
10 [报告]
发表于 2008-11-23 21:51 |只看该作者
(居然能上网,抓紧机会上来换口气    )

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

[ 本帖最后由 win_hate 于 2008-11-23 21:52 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP