SICP 3.5时delay的疑问(关于PLT Scheme)

发布于 2022-08-09 13:40:29 字数 532 浏览 8 评论 4

起初是发现做练习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 技术交流群。

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

发布评论

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

评论(4

椒妓 2022-08-21 21:26:40

原帖由 win_hate 于 2009-3-28 15:32 发表
如果想自己实现 delay + force

可以

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

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

十分感谢!我得到了答案~
我自己去找一找关于Scheme中宏的语法来研究……

请你别敷衍 2022-08-21 21:09:08

如果想自己实现 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 按书本上的抄过来即可。

格子衫的從容 2022-08-21 20:42:37

一般 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)))))

复制代码

捶死心动 2022-08-10 16:11:50

>>起初是发现做练习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 不是宏,是函数。它返回一个带状态的函数,此函数一旦被求值一次,就会记住已经被求值过,已经求值的结果。

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