rebol/rebol — pull request #163 by hostilefork (2013-10-03 01:12:55+00:00)
Title: Simplify TO STRING! and complex construct via MAKE STRING! (CC 2073)

Per [CC #2073](http://curecode.org/rebol3/ticket.rsp?id=2073), this implements newer simpler invariants for TO STRING!, and removal of the existing MAKE STRING! behavior for blocks in order to reserve it for a string creation dialect.

Though it has nothing to do with reversibility...blocks with a single element value in them that can convert to string will work as if you'd passed the element alone:

>> to string! [1]
== "1"

Multi-element blocks will never work, nor will single-element blocks with an any-block inside of them:

>> to string! [1 2]
** Script error: invalid argument: [1 2]
** Where: to
** Near: to string! [1 2]

>> to string! [[1]]
** Script error: invalid argument: [[1]]
** Where: to
** Near: to string! [[1]]

In order to properly do reversibility with TO ANY-BLOCK!, more types are supported than just BLOCK!

>> to string! to paren! "abc def"
== "abc def"

Slight cleanup on naming and consistency with changes in #2073 which also prevents confusion of `make_string()` with the unrelated exported function pointer `void *(*make_string)(u32 size, int unicode)` which is generated for RL_Make_String.

This didn't appear to cause any new problems in core-tests suite, which indicates that maybe the core tests need to have some tests written for TO and MAKE after this. (!)