我觉得我将 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 针对每种目标类型接受的规范的综合列表在哪里?