Rebol2 のオブジェクト/関数で THIRD から取得する文書化されていないブロックは何ですか?
質問
R2 は内部的にコンテキストを 2 つのテーブルとして保存すると読みました。1 つは単語用、もう 1 つは値用なので、それらを要求できます。
o: context [a: 1 b: 2]
>> first o
== [self a b]
>> second o
== [make object! [
a: 1
b: 2
] 1 2]
何らかの形で...
>> pick o 1
== [self a b]
>> pick o 2
== [make object! [
a: 1
b: 2
] 1 2]
しかし、文書化されていないように見える3番目の「テーブル」(ブロック)があり、これには3番目の関数を使用してのみアクセスできます
>> third o
== [a: 1 b: 2]
>> pick o 3
** Script Error: Out of range or past end
** Near: pick o 3
この 3 番目のブロックは何でしょうか?
同様のことが関数でも発生するようですが、今回は、 third と pick の両方がうまく機能します。
>> f: func [a] [print a]
>> first :f
== [a]
>> second :f
== [print a]
>> third :f
== [a]
>> pick :f 1
== [a]
>> pick :f 2
== [print a]
>> pick :f 3
== [a]
最初のブロックは params、2 番目のブロックは body ですが、この 3 番目のブロックは関数内で何を表しているのでしょうか?
解決
気づいた:
>> third o
== [a: 1 b: 2]
>> pick o 3
** Script Error: Out of range or past end
** Near: pick o 3
.
...は奇数です。 1つのエッジケースでは、3番目のPickとは純粋に同義ではなかったREBOL2であるようです。 : - /
REBOL3ではこれはもはやそうではありません。しかし、rebol3の位置選抜がオブジェクトや関数で利用できない場合の場合も何の場合もあります。
>> pick object [a: 1 b: 2] 1
** Script error: pick does not allow object! for its aggregate argument
.
代わりに、単語の単語、値、およびof-
>> words-of object [a: 1 b: 2]
== [a b]
>> values-of object [a: 1 b: 2]
== [1 2]
>> body-of object [a: 1 b: 2]
== [
a: 1
b: 2
]
.
これらは "R2 / Forward"という内蔵ライブラリ内のREBOL2にバックポートされているので、ポジショナルピックの代わりにこれらの関数を使用することができます。
あなたは最初と3番目から同様の回答を得ることに気づいた:
>> f: func [a] [print a]
>> first :f
== [a]
>> second :f
== [print a]
>> third :f
== [a]
>> pick :f 1
== [a]
>> pick :f 2
== [print a]
>> pick :f 3
== [a]
.
最初のブロックはParamsで、2番目のブロックはボディですが、この3番目のブロックは関数内にあるのですか?
あなたの例は3番目の区別がそれが単語のみを含んでいたので、それがスペックの区別だったことに気付くのは簡単でした。だからスペックの言葉と同じでした。あなたの仕様にタイプの制約を追加すると、違いが明らかにされています。
>> f: func [a [integer!]] [print a]
>> first :f
== [a]
>> third :f
== [a [integer!]]
.
もう一度R2 / Forwardを介したREBOL2は、単語の単語、スペック、およびボディの機能を提供します。そしてもう一度、これらのプロパティの位置ピックを使用しないでください。
他のヒント
Third
オブジェクト定義を返します。
>> body: [a: 1 b: 2]
== [a: 1 b: 2]
>> obj: context body
>> equal? body third obj
== true
>> strict-equal? body third obj
== true
それと同じです body-of
Rebol 2.7.7 以降および Rebol 3。