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 的块来选择。但是在 Rebol 3 中进行位置选择是正确的:

>> 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, second,等进行反射(原因可能很明显)。third

一般替换是REFLECT,它采用 FIELD 参数来指定要提取的信息。

为方便起见,REFLECT 依次由一组函数(某些人称为“反射器”)包装:SPEC-OF、BODY-OF、WORDS-OF、VALUES-OF 等。这些是使用 FIRST 进行反射的首选替代品等。幸运的是,这些“反射器”也已向后移植到 R2 (2.7.7+)。

如何翻译third foo成 Rebol 3?

物体上反射 THIRD 的对应物是 BODY-OF。

construct/with (third a) b成语的重点是什么?

它允许您通过合并A 和 B 来构造一个新对象(A 中的值优先于 B)。

因此,例如,您可以使用此习惯用法通过将用户提供的实际选项与默认对象合并来创建完整的“选项”对象。

于 2013-01-15T04:06:54.437 回答
3

a) Construct 在不评估规范块的情况下构建对象。这意味着规范是some [set-word! any-type!]形式的(如果您使用另一个对象的主体,它将始终如此)。Construct/with 使用第二个对象 ( mumble) 作为原型。

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 回答