<div dir="ltr"><div class="gmail_quote"><br><div dir="ltr">Perl are using heredoc notation, for example:<div><br></div><div><div>my $message = &lt;&lt;&#39;END_MESSAGE&#39;;</div><div>void main() {</div><div>     printf(&quot;%s\n&quot;, &quot;hello world&quot;);</div><div>}</div><div>END_MESSAGE<br></div></div><div><br></div><div>or Perl6 </div><div><br></div><div><a href="https://doc.perl6.org/language/quoting" target="_blank">https://doc.perl6.org/language/quoting</a><br></div><div><br></div><div>Lua&#39;s multi-line raw string look like this: </div><div>(you can add extra = inside [[ and ]], in case the text contains [[ or ]])</div><div><br></div><div>local message = [[</div><div><div>void main() {</div><div>     printf(&quot;%s\n&quot;, &quot;hello world&quot;);</div><div>}</div><div>]]<br></div></div><div><br></div><div>or with ]] in text:</div><div><br></div><div>local message = [===[</div><div><div><div>void main() {</div><div>     printf(&quot;[[%s]]\n&quot;, &quot;hello world&quot;);</div><div>}</div><div>]===]<br></div></div></div><div><br></div><div>And C++11 raw string has the same mechanism as Lua (but does not remove first/last newline)</div><div><br></div><div>auto message = R&quot;(void main() {</div><div>     printf(&quot;[[%s]]\n&quot;, &quot;hello world&quot;);</div><div>})&quot;;</div><div><br></div><div>or with )&quot; in text:</div><div><br></div><div><div>auto message = R&quot;===(void main() {</div><div>     printf(&quot;(%s)&quot;, &quot;hello world&quot;);</div><div>})===&quot;;</div></div><div><br></div><div><br></div><div>I think adding extra tag inside the string deliminator is actually a good idea, I would like to revise the proposal as:</div><div><br></div><div>#string(options) ``text``</div><div><br></div><div>And then you can add extra tag inside back-quote, just like Lua and C++11 raw strings, so the shortest version would look like:</div><div><br></div><div>``^\d+``</div><div><br></div><div>It is raw string (escape is disabled), useful for regexp immediately, and if you need to write `` inside the string:</div><div><br></div><div><div>let message = </div><div>`==`</div><div>void main() {</div><div>     printf(&quot;``(%s)``&quot;, &quot;hello world&quot;);</div><div>}</div><div>`==`</div></div><div><br></div><div>or with options:</div><div><br></div><div>let message =</div><div>#string(escape: &quot;$&quot;)</div><div>``</div><div>void main() {</div><div>     printf(&quot;(%s)&quot;, &quot;$(value)&quot;);</div><div>}</div><div>``</div><div><br></div><div><br></div><div><br></div></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">2016-03-24 19:46 GMT+08:00 Step C <span dir="ltr">&lt;<a href="mailto:schristopher@bignerdranch.com" target="_blank">schristopher@bignerdranch.com</a>&gt;</span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Happy to see someone with a proposal on this!<br>
<span><br>
&gt; On Mar 23, 2016, at 12:49 AM, Steve K. Chiu via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;<br>
&gt; Hi,<br>
&gt;<br>
&gt; I am new to swift-evolution list, here is my draft proposal for the multi-line string literal problem.<br>
&gt; The idea had been discussed in the list before, but it seems there are no real solution to many of the string literal problem.<br>
&gt; Let&#39;s first define what are the problem with string literal:<br>
&gt;<br>
&gt; 1. should be able to disable escape char<br>
&gt;<br>
&gt; 2. or better, able to replace escape char with user defined char<br>
</span>Yes!<br>
<span>&gt;<br>
&gt; 3. should be able to write multi-line string literal, and is copy-paste friendly<br>
&gt;<br>
&gt; 4. for multi-line string, should be  able to remove first and last newline char, so user can write string in block<br>
&gt;<br>
&gt; 5. for multi-line string, should be  able to remove leading indent, or remove all indent<br>
&gt;<br>
&gt; 6. for multi-line string, should be  able to replace newline with user defined string (&quot;\r\n&quot;, &quot;\r&quot;, &quot;\r&quot;, or simply &quot; &quot;)<br>
&gt;<br>
&gt; 7. should be able to add feature over time, without breaking existing code<br>
&gt;<br>
&gt; My proposal to the above problem is to introduce new &#39;process instruction&#39; (not sure how to call it), in the following form:<br>
&gt;<br>
&gt; #string(options) &quot;text&quot;<br>
<br>
</span>Building on our meaning for # as compile-time magic. Ok.<br>
<div><div>&gt;<br>
&gt; for example:<br>
&gt;<br>
&gt; #string(escape: nil) &quot;^\d+&quot;<br>
&gt;<br>
&gt; #string(escape: &quot;$&quot;, end: &quot;&lt;EOF&gt;&quot;) &quot;<br>
&gt;    $(username),<br>
&gt;    Is it 1358 yet?<br>
&gt; &lt;EOF&gt;&quot;<br>
&gt;<br>
&gt; It is possible to add many options list above, and you can add more options over time without breaking code.<br>
&gt;<br>
&gt; #string(<br>
&gt;     escape: Character? = &quot;\\&quot;,<br>
&gt;     end: String? = nil,<br>
&gt;     skipEnclosureNewline: Bool = true,<br>
&gt;     skipLeadingIndent: Bool = true,<br>
&gt;     skipAllIndent: Bool = false,<br>
&gt;     newline: String? = nil<br>
&gt; )<br>
&gt;<br>
&gt; for 1. &amp; 2., escape option to replace escape char, pass nil will disable escape.<br>
&gt;<br>
&gt; for 3., end option for end-of-string mark, pass nil will disable multi-line processing.<br>
&gt;<br>
&gt; for 4., skipEnclosureNewline will skip newline if it is the first or last char of the string.<br>
&gt;<br>
&gt; for 5., skipLeadingIndent will skip leading indent, leading indent is the leading white-spaces of first line of multi-line string.<br>
&gt;<br>
&gt; for 5., skipAllIndent will skip all indent, this will override skipLeadingIndent.<br>
&gt;<br>
&gt; for 6., newline option to replace newline char in multi-line string, pass nil will disable the replacement (as-is in the source).<br>
&gt;<br>
&gt; But there are one problem remain, as you can see, the #string with options will become very long; I don&#39;t think it is a pleasure to use such expression except for one time literal. To fix the problem, I propose yet another process instruction:<br>
&gt;<br>
&gt; #let #rex = #string(escape: nil)<br>
&gt; #let #mail = #string(escape: &quot;$&quot;, end: &quot;&lt;EOF&gt;&quot;)<br>
&gt;<br>
&gt; Now you can write the string as:<br>
&gt;<br>
&gt; #rex &quot;^\d+&quot;<br>
&gt;<br>
&gt; #mail &quot;<br>
&gt;    $(username),<br>
&gt;    Is it 1358 yet?<br>
&gt; &lt;EOF&gt;&quot;<br>
&gt;<br>
&gt; #let should be able to be used with other # process instruction as well, for example, #available, among other things.<br>
&gt;<br>
&gt; What do you think?<br>
<br>
</div></div>I&#39;d like to see a comparison to how other languages, particularly Perl, handle this. I like Chris Lattner&#39;s vision for this to be the power-user version of string literals. As you identified, a problem with this solution is verbosity / noisiness. I don&#39;t like the #let #token syntax on first blush - seems macro-ish to me. But I don&#39;t have a better suggestion right now. Hmmm.<br>
<div><div><br>
<br>
&gt;<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; swift-evolution mailing list<br>
&gt; <a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
</div></div></blockquote></div><br></div>
</div></div></div><br></div>