SICP 3.5时delay的疑问(关于PLT Scheme)
起初是发现做练习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 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
十分感谢!我得到了答案~
我自己去找一找关于Scheme中宏的语法来研究……
如果想自己实现 delay + force
可以
复制代码
force, mem-proc 按书本上的抄过来即可。
一般 scheme 都自带了 delay 和 force,并且 delay 已经是带记忆的,相当于含有书本上所说的 memo-proc. 直接用就可以了。
那一节的关键是 cons-stream,它必须是特殊的。
在 mzscheme 中,可以把 cons-stream 实现为:
复制代码
而在 guile 中,则需要加载一个模块
复制代码
>>起初是发现做练习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 不是宏,是函数。它返回一个带状态的函数,此函数一旦被求值一次,就会记住已经被求值过,已经求值的结果。