> On Apr 28, 2019, at 4:32 PM, Brian Goetz <brian.go...@oracle.com> wrote: > > . . . > Looking ahead to the next round, we can build on this. In the first round, > we mistakenly thought that there was something that could reasonably be > called a “raw” string, but this notion is a fantasy; no string literal is so > raw that it can’t recognize its closing delimiter. So “rawness” is really > only a matter of degree.
This is _almost_ true. If a string is truly raw (that is, it can contain _anything_), then one absolutely cannot depend on recognizing the closing delimiter by examining what might be the raw content. Put another way: one cannot determine how long the raw content is by examining it. That’s a solid principle. But there are other ways of determining how long it is. All have this property in common: you have to know how long the content is before you begin to scan it. And this leads to an obvious solution: you need a count of bytes up front. The design currently under consideration can easily accommodate this, now or in the future: a raw string is an opening delimiter, then a byte count (say, expressed as a decimal integer), then a LineTerminator , then as many bytes as the count indicated, then a LineTerminator, then a closing delimiter (the last two are not really needed, but they look nice, satisfy user expectations, and provide some redundancy to help make sure the byte count was correct). Examples: String PrintableAscii = “””95 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ “””; // no need to worry about that embedded backslash String LotsaQuotes = “””50 “””””””””"“””””””””"“””””””””"“””””””””"“””””””””” “””; // the payload cannot be confused with the closing delimiter String LineNoise = “””16 ”””; // I pasted in ^H^I^J^K^L^M^N^O^P^Q^R^S^T^U^V^W here—not sure how it will render in your mail reader The syntax could be further adjusted in arbitrary ways for added clarity: for example String PrintableAscii = “””RAW DATA (95 bytes): !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ “””; Presumably an IDE could help you make sure the byte count is correct. —Guy