3

我觉得我将 MAKE 理解为数据类型的构造函数。它需要两个参数……第一个是目标数据类型,第二个是“规范”。

在对象的情况下,很明显可以使用 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 操作的定义非常相似,只是它用于“转换”而不是“构造”。它还将目标类型作为第一个参数,然后是“规范”。它对价值观的作用不同

>> 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 那样出错。那么为什么不想要一个阻止!将字符串放入块中?

另外:除了阅读解释器的 C 源代码之外,MAKE 和 TO 针对每种目标类型接受的规范的综合列表在哪里?

4

2 回答 2

4

MAKE 是构造函数,TO 是转换器。我们两者都有的原因是,对于许多类型,操作是不同的。如果它们没有不同,我们可以通过一次手术来解决问题。

MAKE 采用一个规范,该规范应该是对您正在构建的值的描述。这就是为什么您可以传递 MAKE 一个块并获取根本不像块的对象或函数之类的值。您甚至可以将一个整数传递给 MAKE 并将其视为分配指令。

TO 采用旨在更直接地转换为目标类型的值(这个值被称为“规范”只是一个不幸的命名失误)。这就是为什么输入中的值更直接地对应于输出中的值的原因。每当有合理的默认转换时,TO 都会这样做。这就是为什么许多类型之间没有定义 TO 转换的原因,类型在概念上差异太大。我们对某些适当的类型进行了相当全面的转换,例如字符串和块,但谨慎地限制了一些更有用的其他转换,例如 fromnone到大多数类型。

在某些简单类型的情况下,实际上并没有一种复杂的方式来描述该类型。对他们来说,让构造函数只是将自描述值作为他们的规范并没有什么坏处。巧合的是,对于相同的类型和值,这最终与 TO 的行为相同。这并没有什么坏处,因此在这种情况下触发错误是没有用的。

没有关于 MAKE 和 TO 行为的全面文档,因为在 Rebol 3 中它们的行为尚未完全确定。在某些情况下,关于正确的行为应该是什么仍然存在一些争论。我们正在努力让事情变得更加平衡,同时又不会失去任何有价值的功能。例如,我们已经做了很多改进none和二进制转换的工作。一旦它们更加定稿,一旦我们有地方放置它们,我们就会有更多的文档。同时,Rebol 2 的大部分行为都被记录在案,到目前为止,Rebol 3 的大部分更改都在 CureCode 中。

于 2013-09-17T06:06:23.997 回答
1

另外:除了阅读解释器的 C 源代码之外,MAKE 和 TO 针对每种目标类型接受的规范的综合列表在哪里?

可能没那么有用,因为它是红色的:

但它至少确实提到了行为是否与 rebol 相似或不同

于 2017-01-02T00:47:55.310 回答