<div dir="ltr">On Wed, Dec 28, 2016 at 2:08 PM, Micah Hainline via swift-evolution <span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;</span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">As an aide to learning I&#39;ve been playing around with implementation of<br>
some of these concepts in the compiler and a few things popped up that<br>
I&#39;m not happy with.<br>
<br>
First, regarding the way #fileLiteral works, it necessitates the<br>
addition of URL.init(<wbr>fileReferenceLiteralResourceNa<wbr>me:) which takes a<br>
string but does not return an optional value. Fine, except that I<br>
don&#39;t have to call #fileLiteral in my code to use that constructor, I<br>
can also use it directly. While I could get compile-time checking on<br>
the #fileLiteral, I can&#39;t on the direct constructor. Additionally, I<br>
could use the direct constructor with any String, not just literals.<br>
Internally that will call ```self = Bundle.main.url(forResource: name,<br>
withExtension: nil)!``` and crash at runtime if it&#39;s not found.<br>
Clearly we do not intend that init to be called directly, but that<br>
isn&#39;t clear to new Swift user Jude Doe, who discovers the API as xe<br>
autocompletes from Xcode.<br></blockquote><div><br></div><div>That could be fixed with documentation. This API design was reviewed and approved as part of SE-0039:</div><div><a href="https://github.com/apple/swift-evolution/blob/master/proposals/0039-playgroundliterals.md">https://github.com/apple/swift-evolution/blob/master/proposals/0039-playgroundliterals.md</a></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">
The second problem comes from String Interpolation. It&#39;s a basic<br>
problem I think with anything that extends the concept of the<br>
string_literal with additional requirements that need to be checked at<br>
compile-time. Right now I can put in something like<br>
```#fileLiteral(resourceName: &quot;\(myString)&quot;)```.</blockquote><div><br></div><div>Can you? SE-0039 says that resourceName should be a static-string-literal, which (unless I&#39;m mistaken) should forbid interpolation.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">While at one level it<br>
might seem nice to be able to construct this sort of thing, it&#39;s not<br>
at all nice from a validation perspective.<br>
<br>
I think this has to be solved at a higher level, in the Lexer, making<br>
a url literal a concept at that level, and fundamentally NOT a string<br>
literal underneath, even if they shared some similar constructs.<br>
<br>
The Lexer would be able to see #url(&quot;https://\(host)&quot;) and say<br>
&quot;Invalid escape sequence in literal, \( is not understood as a url&quot;.<br>
In fact, the URL literal should probably not need ANY escape sequences<br>
or even the concept of escape sequences, since a double-quote is not a<br>
legal character in a URL.<br>
<br>
I definitely think we should take this opportunity to identify that we<br>
do NOT want to use string literal as it currently stands as a base<br>
construct for other literal types. Quite possibly there&#39;s another,<br>
more restricted concept that we can draw out of string literal that<br>
would make a good base construct, but certainly not a string literal<br>
with interpolation.<br>
<br>
<br>
<br>
<br>
On Wed, Dec 28, 2016 at 8:01 AM, Jonathan Hull via swift-evolution<br>
<div class="gmail-HOEnZb"><div class="gmail-h5">&lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;<br>
&gt; On Dec 27, 2016, at 11:46 AM, David Sweeris &lt;<a href="mailto:davesweeris@mac.com">davesweeris@mac.com</a>&gt; wrote:<br>
&gt;<br>
&gt;<br>
&gt; On Dec 22, 2016, at 11:39 PM, Jonathan Hull &lt;<a href="mailto:jhull@gbis.com">jhull@gbis.com</a>&gt; wrote:<br>
&gt;<br>
&gt;<br>
&gt; On Dec 20, 2016, at 12:29 PM, David Sweeris &lt;<a href="mailto:davesweeris@mac.com">davesweeris@mac.com</a>&gt; wrote:<br>
&gt;<br>
&gt;<br>
&gt; On Dec 20, 2016, at 2:11 AM, Jonathan Hull via swift-evolution<br>
&gt; &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;<br>
&gt; Yes, I agree.  I am excited to see what happens in phase 2.<br>
&gt;<br>
&gt; What I am suggesting here is slightly different. Basically being able to use<br>
&gt; RegEx (with capture groups) as a shorthand for a type composed of base<br>
&gt; literals. For example: (StringLiteral, [IntegerLiteral]). Named capture<br>
&gt; groups could even map to a dictionary literal.  I am using “RegEx goes Here”<br>
&gt; to represent RegEx in the examples below, but hopefully it will get it’s own<br>
&gt; literal type in Xcode (Imagine that replacing it here).<br>
&gt;<br>
&gt; func foo( _ param: “RegExGoesHere”) {…} //Definition uses a RegEx where the<br>
&gt; type would normally be<br>
&gt; foo(“my parseable string&quot;) //Calling with a string literal<br>
&gt;<br>
&gt; In this case, ‘param’ takes a string literal when called but the compiler<br>
&gt; converts it to a tuple of literals based on the regEx supplied and passes<br>
&gt; that tuple the function. The type/structure of the tuple is defined by the<br>
&gt; capture groups in the RegEx<br>
&gt;<br>
&gt; The parameter above would only allow string literals to be passed in, and<br>
&gt; would give a compiler error if you tried to pass a variable or if the string<br>
&gt; didn’t conform to the supplied RegEx.  To allow passing String variables you<br>
&gt; would have to add either ‘?’ or ‘!’ after the RegEx definition to handle the<br>
&gt; case where the value doesn’t conform.<br>
&gt;<br>
&gt; func foo( _ param: “RegExGoesHere”?) {…} //‘param&#39; is nil if RegEx fails<br>
&gt; foo(myStringVar) //Calling<br>
&gt;<br>
&gt; func bar( _ param: “RegExGoesHere”!) {…} //fatal error if RegEx fails<br>
&gt;<br>
&gt; When a variable is passed, the RegEx is performed at runtime instead of<br>
&gt; compile time.<br>
&gt;<br>
&gt; Once you have this, the syntax to add new literal types/initializers falls<br>
&gt; out virtually for free.<br>
&gt;<br>
&gt;<br>
&gt; Is “RegExGoesHere” where the regex pattern goes, or where the string you’re<br>
&gt; trying to match goes? If it’s the latter, where does the pattern go? If it’s<br>
&gt; the former, where does the string you’re trying to match go?<br>
&gt;<br>
&gt;<br>
&gt; “RegExGoesHere” is where the pattern goes (instead of the type).  The string<br>
&gt; you are trying to match gets passed in as the parameter (e.g. “my parseable<br>
&gt; string”).<br>
&gt;<br>
&gt; Ah, ok, I think I understand what you’re saying now... You’re suggesting<br>
&gt; that instead of defining a custom type that conforms to “RegExLiteral” (or<br>
&gt; some other mechanism) and using that as the parameter’s type, you put your<br>
&gt; regex pattern as the type directly?<br>
&gt;<br>
&gt;<br>
&gt; Yes.  It is admittedly an advanced feature, but I think it would be a useful<br>
&gt; one.<br>
&gt;<br>
&gt; Thanks,<br>
&gt; Jon<br>
&gt;<br>
&gt;<br>
&gt;<br>
</div></div><div class="gmail-HOEnZb"><div class="gmail-h5">&gt; ______________________________<wbr>_________________<br>
&gt; swift-evolution mailing list<br>
&gt; <a href="mailto:swift-evolution@swift.org">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/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br>
&gt;<br>
______________________________<wbr>_________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br>
</div></div></blockquote></div><br></div></div>