3

Rebol 2:

>> foo: make object! [a: 10 b: 20]

>> foo/a
== 10

>> foo/b
== 20

>> first foo
== [self a b]

>> second foo
== [make object! [
        a: 10
        b: 20
    ] 10 20]

>> third foo
== [a: 10 b: 20]

>> fourth foo
** Script Error: fourth expected series argument of type:
   series date port tuple event
** Near: fourth foo

したがって、値1、2、3のブロックであるかのようにそれを選択できます。ただし、位置選択の実行はRebol3ですぐに実行できます。

>> first foo
** Script error: cannot use pick on object! value
** Where: first
** Near: first foo

これは現在非推奨であることがわかりました(関数を選択してパラメーターリストを取得するなど)。しかし、私は次のようなコードを翻訳しようとしています。

bar: construct/with (third foo) mumble

(a)そのコードのポイントは何ですか?

(b)それをRebol 3にどのように変換しますか?

4

2 に答える 2

5

リフレクションのためのfirst、、、などのこの使用法は実際に非推奨です(そしてそれはおそらく非常に明白な理由です)。secondthird

一般的な置換はREFLECTであり、FIELDパラメーターを使用して、抽出する情報を指定します。

REFLECTは、便宜上、関数のグループ(「リフレクター」と呼ばれることもあります)によってラップされます。SPEC-OF、BODY-OF、WORDS-OF、VALUES-OFなどです。これらは、FIRSTを使用したリフレクションの代替として推奨されます。 etal。幸いなことに、これらの「リフレクター」はR2(2.7.7+)にもバックポートされています。

third fooRebol 3に翻訳する方法は?

オブジェクトの反射THIRDに対応するのはBODY-OFです。

construct/with (third a) bイディオムのポイントは何ですか?

これにより、AとBをマージして新しいオブジェクトを作成できます(Aの値がBよりも優先されます)。

したがって、たとえば、このイディオムを使用して、実際のユーザー提供のオプションをデフォルトのオブジェクトとマージすることにより、完全な「オプション」オブジェクトを作成できます。

于 2013-01-15T04:06:54.437 に答える
3

a)構成は、スペックブロックを評価せずにオブジェクトを構築します。これは、仕様がsome [set-word! any-type!]形式であることを意味します(別のオブジェクトの本体を使用している場合は常にそうなります)。Construct / withはmumble、プロトタイプとして2番目のオブジェクト()を使用します。

b)オブジェクト操作が次のように変更されたように見えます。

i)first objectに置き換えられますwords-of object

ii)second objectに置き換えられますvalues-of object

iii)またはthird objectに置き換えられますbody-of object to block! object

したがって、コードは次のように置き換えることができます。

bar: construct/with body-of foo mumble
于 2013-01-15T04:06:34.683 に答える