忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 4798 | 回复: 4

SICP 3.5时delay的疑问(关于PLT Scheme) [复制链接]

论坛徽章:
0
发表于 2009-03-28 11:29 |显示全部楼层
起初是发现做练习3.51,3.52时和答案不同,开始怀疑自己的延迟求值是否能真正的延时
然后试着构造了一下无限流,发现陷入无穷递归了.
然后自己测试了一下delay(按书上的代码),发现delay的时候会对表达式求值,而delay调用的是memo-proc(按书上的代码)
然后测试memo-proc时发现它也会对表达式直接求值,而非返回一个待求值的lambda表达式.
故猜测PLT Scheme在遇到无参过程时会进行自动的求值.但无法验证.
我在R5RS和Module模式中均遇到了这样的问题.
请求各位高人解答.
-----------
又想了一下,突然发现我的delay和memo-proc根本没有办法做到把表达式保存起来这个功能...应该怎么实现呢?
Sorry,往前狂翻若干页找到了惰性求值的那个...虽然我还不懂Scheme的宏,但是就先拿来用吧...
可是怎么在宏中把memo-proc给加上呢?

[ 本帖最后由 PeterGhostWolf 于 2009-3-28 11:55 编辑 ]

论坛徽章:
0
发表于 2009-03-28 15:25 |显示全部楼层
>>起初是发现做练习3.51,3.52时和答案不同,开始怀疑自己的延迟求值是否能真正的延时
>>然后试着构造了一下无限流,发现陷入无穷递归了.
>>然后自己测试了一下delay(按书上的代码),发现delay的时候会对表达式求值,而delay调用的是memo-proc(按书上的代码)
>>然后测试memo-proc时发现它也会对表达式直接求值,而非返回一个待求值的lambda表达式.

memo-proc 是函数,scheme 对参数求值是严格的,所以会对传给它的表达式求值。

>>故猜测PLT Scheme在遇到无参过程时会进行自动的求值.但无法验证.
>>我在R5RS和Module模式中均遇到了这样的问题.

看不懂你说的。表达式不会被自动求值,除非你主动去求值它。

>>请求各位高人解答.


>>又想了一下,突然发现我的delay和memo-proc根本没有办法做到把表达式保存起来这个功能...应该怎么实现呢?
>>Sorry,往前狂翻若干页找到了惰性求值的那个...虽然我还不懂Scheme的宏,但是就先拿来用吧...
>>可是怎么在宏中把memo-proc给加上呢?

memo-proc 不是宏,是函数。它返回一个带状态的函数,此函数一旦被求值一次,就会记住已经被求值过,已经求值的结果。

论坛徽章:
0
发表于 2009-03-28 15:29 |显示全部楼层
一般 scheme 都自带了 delay 和 force,并且 delay 已经是带记忆的,相当于含有书本上所说的 memo-proc. 直接用就可以了。

那一节的关键是 cons-stream,它必须是特殊的。


在 mzscheme 中,可以把 cons-stream 实现为:


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


而在 guile 中,则需要加载一个模块


  1. (use-modules (ice-9 syncase))

  2. (define-syntax cons-stream
  3.   (syntax-rules ()
  4.     ((_ x y) (cons x (delay y)))))
复制代码

论坛徽章:
0
发表于 2009-03-28 15:32 |显示全部楼层
如果想自己实现 delay + force

可以


  1. ;; 无记忆
  2. ;(define-syntax delay
  3. ;  (syntax-rules ()
  4. ;    ((_ x) (lambda () x))))

  5. ;; 有记忆
  6. (define-syntax delay
  7.   (syntax-rules ()
  8.     ((_ x) (memo-proc (lambda () x)))))
复制代码


force, mem-proc 按书本上的抄过来即可。

论坛徽章:
0
发表于 2009-03-28 16:00 |显示全部楼层
原帖由 win_hate 于 2009-3-28 15:32 发表
如果想自己实现 delay + force

可以


;; 无记忆
;(define-syntax delay
;  (syntax-rules ()
;    ((_ x) (lambda () x))))

;; 有记忆
(define-syntax delay
  (syntax-rules ()
    ((_ x) ( ...

十分感谢!我得到了答案~
我自己去找一找关于Scheme中宏的语法来研究……
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP