MAKE をデータ型のコンストラクターとして理解しているような気がします。2 つの引数を取ります...最初の引数は対象のデータ型で、2 番目の引数は "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 操作は、「構築」ではなく「変換」用であることを除いて、非常によく似て定義されます。また、最初のパラメーターとしてターゲット タイプを取り、次に「仕様」を受け取ります。値に対して異なる動作をします
>> foo: to block! 10
== [10]
>> foo: to block! 12-Dec-2012
== [12-Dec-2012]
それは理にかなっているようです。非シリーズ値を受け取った場合は、それをブロックにラップしました。Any-blockを試すなら!それと価値があるなら、それはあなたにブロックを与えると思います! 内部に同じ値を持つシリーズ:
>> 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 がターゲット タイプごとに受け入れる仕様の包括的なリストはどこにありますか?