Scheme 消息传递方案
谁能简单地向我解释一下在scheme中消息传递是如何实现的?我想我对消息传递的整个概念有点不了解。看看SICP 闭包上下文中的消息传递 下面的示例定义了一个实现简单计算器的闭包。函数Scheme 消息传递方案,scheme,message-passing,Scheme,Message Passing,谁能简单地向我解释一下在scheme中消息传递是如何实现的?我想我对消息传递的整个概念有点不了解。看看SICP 闭包上下文中的消息传递 下面的示例定义了一个实现简单计算器的闭包。函数makecalculator类似于面向对象语言所称的构造函数。区别在于:makecalculator返回函数,而构造函数返回对象值。在面向对象语言中,对象值是第一类值。Scheme没有这样的值。对象第一类值提供访问对象成员变量和对象方法的功能。在Scheme中,必须通过调度函数的定义来模拟此功能生成计算器返回这样一
makecalculator
类似于面向对象语言所称的构造函数。区别在于:makecalculator
返回函数,而构造函数返回对象值。在面向对象语言中,对象值是第一类值。Scheme没有这样的值。对象第一类值提供访问对象成员变量和对象方法的功能。在Scheme中,必须通过调度函数的定义来模拟此功能<代码>生成计算器返回这样一个函数。make计算器的主体定义
- 两个变量
a
和b
(成员变量)
- 两个变异函数
set-a代码>和set-b代码>(存取器)
- 四个求值函数
加法
,减法
,乘法
和除法
(方法)
上述定义是闭包makecalculator
的本地定义。在面向对象的语言中,它们被称为private。分派函数使函数公开,并使变量保持私有。这是可行的,因为分派函数可以访问makecalculator
闭包的本地范围。dispatch函数接受消息并返回匹配函数。这将向分派函数的调用者公开本地函数
(define (make-calculator)
(define a)
(define b)
(define (set-a! value)
(set! a value))
(define (set-b! value)
(set! b value))
(define (addition)
(+ a b))
(define (subtraction)
(- a b))
(define (multiplication)
(* a b))
(define (division)
(/ a b))
(lambda (message)
(case message
((set-a!) set-a!)
((set-b!) set-b!)
((addition) addition)
((subtraction) subtraction)
((multiplication) multiplication)
((division) division))))
首先,必须调用构造函数来创建“对象”calc
是分派功能,它接受不同的消息,这些消息只是符号
(define calc (make-calculator))
发送消息意味着使用符号参数调用分派函数。下面发送消息set-a
到calc
,返回本地函数set-a代码>。在本例中,消息的名称和本地函数的名称相同。这有助于避免混淆,但不是必需的
(calc 'set-a!) ;; => #<procedure set-a!>
现在我们可以计算:
((calc 'addition)) ;; => 8
((calc 'subtraction)) ;; => -2
((calc 'multiplication)) ;; => 15
((calc 'division)) ;; => 3/15
代码就是这样工作的。这是一个非常模糊的问题,很难回答。你能试着问一个更具体/详细的问题吗?你是指面向对象的意义吗?如果是这样,你可以看看丹·弗里德曼的。或者你的意思是并发意义上的?(ReadScheme.org上有一个关于并发性的网站,您可以查看)
((calc 'addition)) ;; => 8
((calc 'subtraction)) ;; => -2
((calc 'multiplication)) ;; => 15
((calc 'division)) ;; => 3/15