外部范围的槽如何被selflanguange修改

时间:2013-07-27 14:58:23

标签: selflanguage

我试图理解自我语言。(没有实际编码!)

我想知道一种方法如何能够修改其接收器的插槽。我的理解是:在self中,'self *'被赋予激活记录的父指针。因此,如果方法无法在本地找到插槽,它将查找“self *”。但根据我的理解,当在任何对象中,如果我设置一个插槽(比如说“x”),它只设置一个本地插槽而不修改其父节点的插槽“a”。

1 个答案:

答案 0 :(得分:3)

Self中的插槽,接收器的“本地”或任何其他对象的“远程”,实际上根本不可写。

这意味着即使是'self'也无法直接更改本地插槽(没有元编程和镜像)。

自我中的插槽访问

(您可以找到一个很好的讨论in the Self handbook

但是,当您在对象创建时创建一个插槽时,您可以决定插槽 是“可写的”。那怎么说,当我说没有可写的插槽?

所以,你有一个对象:

(| a = 3. |)

然后a永远不会写,但是当你说

(| a <- 3. |)

然后实际上创建了两个广告位:a,其中包含3a:,其中包含分配原语。赋值原语能够更改a的内容,以便您可以说

(| a <- 3 |) a: 4 " => a is 4 now"

这是一个简单的消息发送。 这在方法激活方面没有区别。任何插槽改变行为都是

  • 通过作为assginments基元的方法(用<-定义),
  • 或通过元编程和镜像。

因此,当您的父母有一个分配槽时,您肯定可以修改其槽位:

| p . o |
p: (| a <- 3 |).
o: (|
    parent* = p.
    b <- 4.
    c = ( a: 4 ).
   |).

p a. "-> 3"
o c.
p a. "-> 4"

(如果您想在shell中这样做,请执行以下操作:

bootstrap addSlotsTo: bootstrap stub -> 'globals' -> () From: (|
  p <- (| a <- 3 |).
|).
(|
  parent* = p.
  b <- 4.
  c = ( a: 4 ).
|)

然后“Get It”并评估c