1

私は自己言語を理解しようとしています.(実際にコーディングせずに!)

メソッドがレシーバーのスロットをどのように変更できるのか疑問に思っていました。私の理解では、self では、'self*' がアクティベーション レコードの親ポインターとして指定されます。そのため、メソッドがローカルでスロットを見つけることができない場合、「self*」を検索します。しかし、私の理解では、任意のオブジェクトでスロットを設定すると (「x」など)、ローカル スロットのみが設定され、その親のスロット「a」は変更されません。

4

1 に答える 1

3

Self のスロットは、レシーバーに対して「ローカル」であるか、他のオブジェクトのように「リモート」であるかに関係なく、実際には直接書き込み可能ではありません。

これは、「自己」でさえローカルスロットを直接変更できないことを意味します (つまり、メタプログラミングとミラーなしで)。

自己のスロット アクセス

( Self ハンドブックで適切な議論を見つけることができます)

ただし、オブジェクト作成時にスロットを作成すると、スロットが「書き込み可能」かどうかを決定できます。書き込み可能なスロットがないと言ったのはどうしてですか?

だから、あなたはオブジェクトを持っています:

(| a = 3. |)

thenaは決して書き込み可能ではありませんが、あなたが言うとき

(| a <- 3. |)

次に、実際には2 つのスロットが作成されます:aを含む3、割り当てプリミティブa:を含む。割り当てプリミティブは、次のように の内容を変更できます。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 ).
|)

次に、「取得」して評価しcます)

于 2013-07-31T12:54:17.937 に答える