我觉得我把 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 操作的定义非常相似,只是它用于“转换”而不是“构造”。它还将目标类型作为第一个参数,然后是“规范”。它对值(value)观的作用不同
>> 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 接受的规范的完整列表在哪里?
最佳答案
MAKE 是一个构造函数,TO 是一个转换器。我们两者都有的原因是对于许多类型,操作是不同的。如果他们没有不同,我们可以通过一次手术来解决。
MAKE 需要一个规范,该规范应该是对您正在构建的值的描述。这就是为什么您可以传递 MAKE 一个块并获取根本不像块一样的对象或函数之类的值。您甚至可以将一个整数传递给 MAKE 并将其视为分配指令。
TO 采用一个旨在更直接转换为目标类型的值(这个值被称为“规范”只是一个不幸的命名事故)。这就是为什么输入中的值更直接对应于输出中的值。只要有合理的默认转换,TO 就会执行。这就是为什么许多类型没有在它们之间定义 TO 转换的原因,这些类型在概念上太不同了。我们对一些合适的类型进行了相当全面的转换,例如到字符串和块,但仔细限制了一些其他更有用的转换,例如从 none
到大多数类型。
在某些简单类型的情况下,确实没有一种复杂的方法来描述类型。对他们来说,让构造函数将自我描述的值作为他们的规范并没有什么坏处。巧合的是,对于相同的类型和值,这最终与 TO 的行为相同。这不会造成伤害,因此在这种情况下触发错误是没有用的。
没有关于 MAKE 和 TO 行为的综合文档,因为在 Rebol 3 中,它们的行为尚未完全确定。在某些情况下,关于正确的行为应该是什么,仍然存在一些争论。我们正在努力使事情更加平衡,而不会失去任何有值(value)的功能。例如,我们已经做了很多工作来改进 none
和二进制转换。一旦它们更加定稿,一旦我们有地方放置它们,我们就会有更多的文档。与此同时,Rebol 2 的大部分行为都被记录在案,到目前为止 Rebol 3 的大部分变化都在 CureCode 中。
关于constructor - TO 和 MAKE 的目的有什么区别,它们在哪里记录?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18839596/