3

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 がターゲット タイプごとに受け入れる仕様の包括的なリストはどこにありますか?

4

2 に答える 2

4

MAKE はコンストラクター、TO はコンバーターです。両方がある理由は、多くの型で操作が異なるためです。違いがなければ、1回の手術で済みます。

MAKE は、構築している値の説明であるはずの仕様を取ります。これが、MAKE をブロックに渡して、オブジェクトや関数など、まったくブロックらしくない値を取得できる理由です。MAKE に整数を渡して、割り当てディレクティブのように扱うこともできます。

TO は、より直接的にターゲット型に変換されることを意図した値を取ります (この値が "spec" と呼ばれるのは、不幸な命名ミスです)。これが、入力の値が出力の値により直接的に対応する理由です。適切なデフォルト変換がある場合はいつでも、TO がそれを行います。そのため、多くの型で TO 変換が定義されていません。これらの型は概念的にあまりにも異なります。文字列やブロックなど、これが適切ないくつかの型についてはかなり包括的な変換がありますが、noneからほとんどの型など、禁止する方が便利な他の変換を慎重に制限しています。

単純型のいくつかのケースでは、型を記述するための複雑な方法は実際にはありません。彼らにとっては、コンストラクターが仕様として自己記述型の値を取るだけでも問題ありません。偶然にも、これは同じ型と値の TO と同じ動作になります。これは問題ないので、この場合にエラーをトリガーしても意味がありません。

MAKE と TO の動作に関する包括的なドキュメントはありません。Rebol 3 ではそれらの動作が完全に確定されていないためです。適切な動作がどうあるべきかについて、場合によってはまだいくつかの議論があります。貴重な機能を失うことなく、よりバランスの取れたものにしようとしています。noneたとえば、改善やバイナリ変換など、すでに多くの作業を行っています。それらがさらに完成し、それらを配置する場所ができたら、さらに多くのドキュメントを用意します. その間、Rebol 2 の動作のほとんどは文書化されており、Rebol 3 のこれまでの変更のほとんどは CureCode に含まれています。

于 2013-09-17T06:06:23.997 に答える