SICP第3.4节互斥体的实现
当作者实现序列化器的互斥部分时,他们使用一个名为 cell
的列表。但列表只包含一个元素,那么为什么不直接使用变量呢?
When the authors implement the mutex part of serializers, they use a list called cell
. But the list only contains one element, so why not just use a variable?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
因为变量不是可以传递给另一个函数的一流值。在 3.4 中,作者实现了一个
make-mutex
函数,该函数使用clear!
作为辅助函数,该函数接受一个单元格。如果单元格由可变变量表示,则必须在make-mutex!
内定义clear!
来关闭该变量。test-and-set!
辅助函数也是如此。他们也可以使用一个盒子来代替一个牢房。
Because a variable isn't a first-class value that you can pass to another function. In 3.4, the authors implement a
make-mutex
function that usesclear!
as a helper function, which takes a cell. If the cell were represented by a mutable variable, thenclear!
would have to be defined insidemake-mutex!
to close over that variable. The same goes for thetest-and-set!
helper function.They also could have used, say, a box instead of a cons cell.
如果在那里使用变量而不是列表,则过程
clear!
和test-and-set!
将不起作用,因为Scheme是按值传递的。If a variable is used there instead of a list, the procedures
clear!
andtest-and-set!
won't work since Scheme is pass-by-value.