Scheme中如何让两个过程/宏共享同一局部环境并实现指定功能?
解决共享局部环境的两个过程问题
嘿,你这个需求用闭包就能轻松搞定,完全不需要call/cc或者协程!你之前的代码里,每次调用proc1都会重新创建一个局部的x,所以proc2根本没办法访问到同一个变量实例。我们只需要把共享的变量放在一个外层作用域里,让两个过程都能捕获到它就行。
实现方案
这里用define-values来一次性定义两个共享环境的过程,外层的let创建了只有这两个过程能访问的私有变量:
(define-values (proc1 proc2) (let ((x 0)) ; 这是两个过程共享的私有局部变量,全局环境无法访问 (values ; proc1:设置x的值并返回新值 (lambda (val) (set! x val) x) ; proc2:将当前x的值与输入的数字相加,返回结果 (lambda (num) (+ x num)))))
测试示例
运行以下代码就能看到预期效果:
(proc1 5) ; => 5 (此时x被设置为5) (proc2 6) ; => 11(5+6的结果) (proc1 10) ; => 10(x更新为10) (proc2 3) ; => 13(10+3的结果)
原理说明
这里的核心是闭包特性:两个lambda过程都捕获了外层let中的x变量,它们共享同一个变量实例。这个x对外是完全隐藏的,只有proc1和proc2能修改或读取它,完全不会污染全局环境,完美符合你的需求。
如果非要用宏的话其实没必要,因为宏主要用于编译期的代码变换,而我们需要的是运行时的共享状态,闭包是最简洁直接的方案。
内容的提问来源于stack exchange,提问作者ElisaDay
相关产品推荐
相关产品推荐

