【问题标题】:How slot of outer scope is modified by selflanguangeselflangunge 如何修改外部作用域的槽
【发布时间】:2013-07-27 14:58:23
【问题描述】:

我正在努力理解自己的语言。(没有实际编码!)

我想知道一个方法如何能够修改其接收者的插槽。我的理解是:在self中,'self*'作为激活记录的父指针给出。因此,如果一个方法无法在本地找到插槽,它将查找“self*”。但据我了解,当我在任何对象中设置一个插槽(比如“x”)时,它只会设置一个本地插槽,而不会修改其父级的插槽“a”。

【问题讨论】:

    标签: selflanguage


    【解决方案1】:

    Self 中的槽,无论是接收器的“本地”还是任何其他对象的“远程”,实际上根本不能直接写入。

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

    自我中的插槽访问

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

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

    所以,你有一个对象:

    (| a = 3. |)
    

    那么a 是永远不可写的,但是当你说时

    (| a <- 3. |)
    

    那么实际上创建了两个槽:a,其中包含3a:,其中包含分配原语。赋值原语可以改变a的内容,这样你就可以说

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

    这是一个简单的消息发送。 这在方法激活中没有什么不同。任何改变槽的行为都会发生

    • 通过作为 assginments 原语的方法(使用 &lt;- 定义),
    • 或通过元编程和镜像。

    因此,当你的父母有一个分配槽时,你当然可以修改它的槽:

    | 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 ).
    |)
    

    然后“得到它”并评估c)

    【讨论】:

    • 哇!顺便说一句,代码“父 * = p”。给出错误在大厅中找不到“p”插槽。 BTW 如何在 self 方法中定义局部变量。你能提供一个解释 self 语法的链接吗?(例如,我刚刚猜到由 (| content |) 初始化的对象和由 () 初始化的方法)。自我手册非常简短。
    • 对于大厅:使用第二个例子,它将p添加到大厅以使其在o的创建中可用
    • 对于语法:从tutorial 开始,或者更深入地从1987 paper “Self: the power of simplicity” 的第6、7 章开始
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 2017-09-29
    • 2014-02-19
    • 2020-04-30
    相关资源
    最近更新 更多