必须通过强制检查将附加本地声明为可分离属性的语义

semantic of having to declare an attached local into detachable attribute with mandatory check

据我了解,checkthen 是强制性的。

那么必须声明一个局部变量以避免编译错误的语义是什么 (object could be void)?

detachable dog: DOG

take_a_walk
    do
        check
            attached_dog: attached dog as l_dog
        then
            leash (l_dog) -- why not just leash (dog)?
            walk
        end
    end     

因为该属性可能会在另一个线程中设置为 void

可分离类型的属性在其无效性测试后无法使用的主要原因有两个:

  1. 一旦无效性测试后的一系列调用涉及的不仅仅是一个调用,就几乎不可能弄清楚该属性是否仍然附加。这是一个带有属性 x:

    的示例
    if attached x then
        foo
        x.bar
    end
    

    调用foo可以将Void赋值给属性x。因此,调用 x.bar 现在是不安全的(可能导致对 Void 目标的调用)。在语言术语中,x 应被视为可分离的,而不管早​​期的无效性测试如何。 (将此与 x 是局部变量时的使用进行比较:对 foo 的调用无法更改 x,而对 x.bar 的调用则可以。)

  2. 在多线程环境中,可以在后台更改属性值。让我们考虑以下带有属性 x:

    的示例
    if attached x then
        x.bar
    end
    

    这是导致问题的执行顺序:

    • 属性 x 进行了无效测试,attached x 给出了 True
    • 另一个线程获得控制并执行 x := Void
    • 控制权返回原线程,x.bar调用在Void目标上执行。

与示例 1 一样,如果 x 是一个局部变量,代码就可以了。

以上所有推理都假定可以分配一个属性 Void。如果这是错误的,即当这样的分配是不可能的时候怎么办?在这种情况下,属性可以标记为 stable:

x: detachable FOO
    note
        option: stable
    attribute
    end

那么,在void安全性方面,该属性表现为一个局部变量,上面的所有代码片段都有效并且编译没有错误。