On Fri Jul 03 12:29:34 2015, masak wrote:
> <hoelzro> I found some behavior using heredocs, and I'm not really
> sure what the right thing to do is
> <hoelzro> https://gist.github.com/hoelzro/3b1ff9951908c9ce5aa4
> 
> (Gist shows the following heredoc with a \n in it, which gives a
> de-indentation warning at compile time.)
> 
> my $here = qq:to/END_TEXT/;
> foo\nbar
> END_TEXT
> 
> <hoelzro> it's concerning how leading whitespace removal is handled
> when one has an embedded newline via \n in a heredoc
> <timotimo> oh, interesting
> <timotimo> i hadn't considered newlines that are escaped inside
> heredocs like that when i wrote the new dedenting code
> <hoelzro> timotimo: I hadn't considered it either until I was
> converting code that used a single non-heredoc line and came across
> that =/
> <hoelzro> I would file a ticket, but I don't even know if that's a
> bug.  I don't even know what I expect it should do!
> <lucasb> Is there a way to dedent the heredoc literal text before
> expanding newline escape sequences?
> <hoelzro> TimToady may have to weigh in
> <masak> I'm... not sure I feel that's a bug...
> <hoelzro> masak: "not sure" is the thing with me too =/
> <masak> I can understand the argument that this \n newline is not part
> of the heredoc's actual newlines, but...
> <masak> ...I'm also not ready to tear up compiler internals just to
> fix this one.
> <masak> but let's see if TimToady has some nice insight about it.
> <masak> it's kind of related to (but not the same as)
> http://strangelyconsistent.org/blog/here-be-heredocs under the heading
> "Indentation, revisited"
> <colomon> why would you want to embed a \n in a heredoc?
> <masak> colomon: that's a good, but separate question :)
> <masak> we're exploring "what happens when you do?"
> <masak> I don't believe it should be illegal.
> <hoelzro> colomon, masak: there's no good reason, I just found it
> interesting
> <masak> it is interesting.
> <hoelzro> I was converting a long single double quoted string with
> multiple embedded newlines into a heredoc while refactoring a program
> <masak> I mean, from the user's point of view, a \n in a heredoc isn't
> the same as a hard newline in a heredoc.
> <hoelzro> right
> <colomon> what happens if you embed a string with a newline in it?  I
> actually do that quite a bit in my (mostly p5) scripts
> <masak> colomon: read the blog post I linked.
> <jnthn> I seem to remember I did it one way in the original herdocs
> impl in Rakudo, and something was off and got changed (probably what
> masak++ is referencing)
> <masak> yes.
> <TimToady> re \n in heredocs, the dedent should be happening before \n
> interpolation, just as it happens before $I-contain-a-newline
> interpolation
> <TimToady> so re http://irclog.perlgeek.de/perl6/2015-07-03#i_10845432
> I'd call it a bug
> 
> (URL referencing hoelzro's original example at the top of this report)
> 
> <TimToady> recall that dedent is only for the purposes of establishing
> a false margin on the literal text, so from the user's perspective it
> really needs to happen before any kind of string processing
> <TimToady> I can think of several ways to fix it
> <TimToady> one is to treat \n interpolation more like $newline
> interpolation
> <TimToady> another is to substitute a sentinel character for \n inside
> heredoc parsing, and only dedent after the sentinel (and replace the
> sentinel with a real \n)
> * masak submits TimToady-approved heredoc \n de-indentation rakudobug

Turns out there was a neater way than a sentinel: in the case of being inside a 
heredoc, code-gen \n and \r\n as an AST node, not just a string. This triggers 
the same codepaths that deal with interpolation.

Tests in S02-literals/quoting.t.

/jnthn

Reply via email to