Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scheme 消息传递方案_Scheme_Message Passing - Fatal编程技术网

Scheme 消息传递方案

Scheme 消息传递方案,scheme,message-passing,Scheme,Message Passing,谁能简单地向我解释一下在scheme中消息传递是如何实现的?我想我对消息传递的整个概念有点不了解。看看SICP 闭包上下文中的消息传递 下面的示例定义了一个实现简单计算器的闭包。函数makecalculator类似于面向对象语言所称的构造函数。区别在于:makecalculator返回函数,而构造函数返回对象值。在面向对象语言中,对象值是第一类值。Scheme没有这样的值。对象第一类值提供访问对象成员变量和对象方法的功能。在Scheme中,必须通过调度函数的定义来模拟此功能生成计算器返回这样一

谁能简单地向我解释一下在scheme中消息传递是如何实现的?我想我对消息传递的整个概念有点不了解。

看看SICP

闭包上下文中的消息传递 下面的示例定义了一个实现简单计算器的闭包。函数
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