我觉得我理解MAKE是数据类型的构造函数。它需要两个参数......第一个是目标数据类型,第二个是“spec”。
对于对象,很明显可以使用Rebol数据块作为“规范”来获取对象类型的值!
>> foo: make object! [x: 10 y: 20 z: func [value] [print x + y + value] ]
== make object! [
x: 10
y: 20
]
>> print foo/x
10
>> foo/z 1
31
我知道如果你在创建一个块时传递一个整数,它会预先分配足够的底层内存来保存那个长度的块,尽管它是空的:
>> foo: make block! 10
== []
这有点道理。如果你传入一个字符串,那么你得到的字符串解析为Rebol标记...
>> foo: make block! "some-set-word: {String in braces} some-word 12-Dec-2012"
== [some-set-word: "String in braces" some-word 12-Dec-2012]
并非所有类型都被接受,而且到目前为止我还会说...很好。
>> foo: make block! 12-Dec-2012
** Script error: invalid argument: 12-Dec-2012
** Where: make
** Near: make block! 12-Dec-2012
相比之下,TO操作的定义非常相似,只是用于“转换”而不是“构造”。它还将目标类型作为第一个参数,然后是“spec”。它对值
的行为不同>> foo: to block! 10
== [10]
>> foo: to block! 12-Dec-2012
== [12-Dec-2012]
这似乎很合理。如果它收到非序列值,则将其包装在一个块中。如果您尝试任何阻止!它的价值,我想它会给你一个块!内部具有相同值的系列:
>> foo: to block! quote (a + b)
== [a + b]
所以我希望将一个字符串包装在一个块中,但它只是做与MAKE相同的事情:
>> foo: to block! "some-set-word: {String in braces} some-word 12-Dec-2012"
== [some-set-word: "String in braces" some-word 12-Dec-2012]
为什么TO与MAKE如此多余,他们的区别背后的逻辑是什么?将整数传递给阻止!获取一个块内的数字(而不是具有特殊构造模式),并且日期进入阻止!在一个块中生成日期而不是与MAKE一样的错误。那么为什么不希望阻止字符串将字符串放入块中呢?
另外:超出reading the C sources for the interpreter,MAKE和TO为每种目标类型接受的全面规范列表在哪里?
答案 0 :(得分:4)
MAKE是构造函数,TO是转换器。我们两者兼顾的原因是,对于许多类型而言,操作是不同的。如果它们没有什么不同,我们可以通过一次操作来完成。
MAKE采用的规范应该是您正在构建的值的描述。这就是为什么你可以传递MAKE一个块并获得像对象或函数那样根本不像块的值。您甚至可以将一个整数传递给MAKE,并将其视为分配指令。
TO取一个意图更直接转换为目标类型的值(这个值被称为“spec”只是一个不幸的命名事故)。这就是为什么输入中的值更直接对应于输出中的值的原因。只要有合理的默认转换,TO就会这样做。这就是为什么许多类型没有在它们之间定义TO转换的原因,这些类型在概念上太不同了。我们针对某些类型(例如字符串和块)进行了相当全面的转换,但仔细限制了一些对禁止更有用的其他转换,例如从none
到大多数类型。
在某些简单类型的情况下,确实没有一种复杂的方式来描述类型。对于他们来说,让构造函数只将自描述值作为他们的规范并不会有害。巧合的是,对于相同的类型和值,这最终与TO的行为相同。这没有坏处,因此在这种情况下触发错误没有用。
没有关于MAKE和TO行为的综合文档,因为在Rebol 3中,他们的行为尚未完全确定。在某些情况下,仍然存在一些关于适当行为应该是什么的争论。我们正在努力使事情更加平衡,同时又不失任何有价值的功能。例如,我们已经完成了许多改进none
和二进制转换的工作。一旦他们更加完成,一旦我们有了放置它们的地方,我们将有更多的文档。同时记录了大部分Rebol 2行为,目前Rebol 3的大部分变化都在CureCode中。
答案 1 :(得分:1)
另外:除了阅读解释器的C源代码之外,其中是 MAKE和TO为每个目标接受的完整规范列表 类型?
可能没那么有用,因为它具有特定的红色:
但如果行为与rebol类似或不同,它至少提及