Hello Matz,

On 2011/10/03 6:38, Yukihiro Matsumoto wrote:

> In message "Re: [ruby-core:39840] Re: Discussion results"
>      on Mon, 3 Oct 2011 03:36:02 +0900, Intransition<transfire / gmail.com>  writes:

> |3)  Add margin literal, e.g.
> |
> |>  %L|This is
> |        |  margin
> |        |    controlled.
> |    =>  "This is\n  margin\n    controlled."
> |
> |Nothing sucks more for readability than having to flush a literal
> |string to the left margin in the middle of indented code.
>
> Use here documents.  At least above syntax requires huge overhaul of
> the lexer/parser, that I don't think worth it.

I agree that this should use here document syntax. But that means we
have to improve here document syntax. I have been annoyed by here
documents annoyingly and confusingly sticking out of the indenting for
quite some time, so I came up with the following idea:

We currently have:

my_string = <<HERE
doc
doc
doc
HERE
-> "   doc\n   doc\n   doc\n"

and:

my_string = <<-HERE
doc
doc
doc
HERE
-> "   doc\n   doc\n   doc\n"

What we'd like to have is something like

my_string = <<+HERE
doc
doc
doc
HERE
-> "doc\ndoc\ndoc\n"

I have just used '+' as a special character instead of '-', and have
taken the indent of the ending string as the indent of the whole block
of text, but that may be too difficult to implement.

Another idea is to require the size of the indent explicitly, e.g. like
this:

my_string = <<+3HERE
doc
doc
doc
HERE
-> "doc\ndoc\ndoc\n"

But that may be too brittle (if I change the indenting, I have to change
the number, too).

The main point is that the source is indented (so it doesn't obstruct
the overall visual flow of the document, where this here doc is maybe
inside a module or two and inside a class and a method and maybe inside
a block and an if and so), but the resulting string doesn't contain
these indents.

Regards,    Martin.