オブジェクトにコードを動的に追加しないのはなぜRevol2で有効になりますか?
質問
この質問は、ReBol 2でコンテキストやオブジェクトへのコードを動的に追加することです。rebol のコンテキストに単語を動的に追加する>は同じ種類ではありません。
コードブロックを使用してRebolオブジェクトに動的にコードを追加したい場合は、奇妙な動作のためにトラブルになった:
>> append third o [c: 3]
== [a: 1 b: 2 c: 3]
.
しかし...
>> first o
== [self a b]
>> second o
== [make object! [
a: 1
b: 2
] 1 2]
>> third o
== [a: 1 b: 2]
.
追加がありません!first o
またはsecond o
「一般的な」ブロックを使用しては発生しません:
>> m: [a [b] c]
== [a [b] c]
>> append m 3
== [a [b] c 3]
>> m
== [a [b] c 3]
>> append second m 1
== [b 1]
>> m
== [a [b 1] c 3]
.
なぜこれは?
解決
third
関数は元のオブジェクトスペックを返さないため、オブジェクトの単語と値から生成されたセットワードと値の新しいブロックを返します。そのため、その新しいブロックを追加しています(これはブロックに影響を与えませんが、オブジェクトは影響しません)。
オブジェクト仕様として渡された元のブロックへのシリーズ参照を取得することはできません。オブジェクトが構築された後は捨てられ、とにかくオブジェクトにそれ以上の影響を与えません。 であっても、make object
に渡されたブロックへの参照を保存し、オブジェクトに追加することはできません。
ReBol 2のオブジェクトに追加できませんが、ReBol 3では、オブジェクトに追加できます。
>> append make object! [a: 1 b: 2] [c: 3]
== make object! [
a: 1
b: 2
c: 3
]
.
(ReBol 2の順序反射器を使用しないでください.2。words-of
の代わりにfirst
、values-of
の代わりにsecond
を使用します。 5年前に出てきて、REBOL 3で削除されました。)
所属していません StackOverflow