オブジェクトにコードを動的に追加しないのはなぜRevol2で有効になりますか?

StackOverflow https://stackoverflow.com//questions/22054644

質問

この質問は、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の代わりにfirstvalues-ofの代わりにsecondを使用します。 5年前に出てきて、REBOL 3で削除されました。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top