<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 18 April 2014 16:58, Ed Kellett <a href="http://edk141-at-gmail.com">edk141-at-gmail.com</a> |<a href="http://python-ideas-at-python.org">python-ideas-at-python.org</a>| <span dir="ltr"><<a href="mailto:baswps8ght@sneakemail.com" target="_blank">baswps8ght@sneakemail.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div class="">
</div>    case foo():<br>
<br>
would have to become<br>
<br>
    case (foo(),):<br>
<br>
to work as expected when foo() returned a tuple, which would mean<br>
wrapping things in 1-tuples whenever you wanted to reliably match a<br>
case that is determined dynamically.<br>
</blockquote></div><br></div><div class="gmail_extra">To obviate this, instead of tuples <span style="font-family:courier new,monospace">case</span> could check membership of CaseTuples. CaseTuple will be a class that extends tuple, identical to it, and a <span style="font-family:courier new,monospace">case</span> expression list with commas will yield a CaseTuple. To use other iterables as case expression list you'll have to unpack them, or they will be matched for equality.<br>

<br><br>On 18 April 2014 17:03, Joao S. O. Bueno <a href="http://jsbueno-at-python.org.br">jsbueno-at-python.org.br</a> |<a href="http://python-ideas-at-python.org">python-ideas-at-python.org</a>| <span dir="ltr"><<a href="mailto:0ucjz7dbjt@sneakemail.com" target="_blank">0ucjz7dbjt@sneakemail.com</a>></span> wrote:<br>

<blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex" class="gmail_quote">It may be just me, but I fail - in a complete manner - to see how this<br>
syntax can offer any<br>
improvement on current if/elif chains. It seems to differ from that<br>
only by reducing<br>
the explicitness, and the flexibility of the test condition that can<br>
be used in any<br>
of the subconditions<br></blockquote><div><br></div><div>It's more simple to use when you can use it, as switch statement in the other languages. And it somewhat adheres to the DRY principle: why repeat the subject? If I'm checking what type of tarot card I have, why should I repeat every time I'm trying to identify a tarot card? <br>

I also thought about a syntax like this:<br><br><span style="font-family:courier new,monospace">"case" comparator case_expr ":"</span><br><br></div><div>but IMHO it's too verbose for the typical uses of switch. If you want flexibility, you can always use <span style="font-family:courier new,monospace">if-elif</span>.<br>

<br><br></div><div>@Skip Montanaro: yes, switch statement is used in C also for code optimization. Frankly, I think this aspect is unimportant for CPython in the present time.<br><br><br>On 18 April 2014 18:51, Andrew Barnert <a href="http://abarnert-at-yahoo.com">abarnert-at-yahoo.com</a> |<a href="http://python-ideas-at-python.org">python-ideas-at-python.org</a>| <span dir="ltr"><<a href="mailto:3en9kh2cbt@sneakemail.com" target="_blank">3en9kh2cbt@sneakemail.com</a>></span> wrote:<br>

<blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex" class="gmail_quote">No it isn't. First, the "for ... in" keywords are not the same as just 
"for" and a bunch of parens and semicolons.<br></blockquote><div><br></div><div>My propose has <span style="font-family:courier new,monospace">elcase</span>, that is not present in other languages.<br><br><br><blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex" class="gmail_quote">

Also, notice that if you try to read the switch statement, or your Python version, as English, it's nonsense.<br></blockquote><div><br></div><div>Yes, the fact a <span style="font-family:courier new,monospace">case</span> will behave differently for tuples and non-tuples will be difficult to translate in English. I think that with CaseTuple proposal it will be more understandable, since you have to explicitly unpack an iterable, or use elements separated by commas.<br>

<br><br><blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex" class="gmail_quote">Bash doesn't have separate "case" and "elcase" cases. After one case is 
done, the rest are skipped, just as in most other languages. <br></blockquote><br></div><div>But it has <span style="font-family:courier new,monospace">;& <span style="font-family:arial,helvetica,sans-serif">and</span> ;;& <span style="font-family:arial,helvetica,sans-serif">similarly to <span style="font-family:courier new,monospace">break</span> and <span style="font-family:courier new,monospace">continue</span> of C, that it's equivalent to <span style="font-family:courier new,monospace">case</span> and  <span style="font-family:courier new,monospace">elcase</span> of my proposal.</span><br>

<br><br></span><blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex" class="gmail_quote"> I don't see how skipping over any elcase but falling through to the next case is in any way simpler than C.</blockquote>

<div><br></div><div>Well, because it's coherent with <span style="font-family:courier new,monospace">if-elif</span>. See my last example in my first message.<br><br><br><blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex" class="gmail_quote">

Well, then at least look at the limited form of pattern matching Python 
has in the for and assignment statements and parameter matching, and 
maybe look at how pattern matching is used with case statements in other
 languages; don't try to suggest language designs based on guesses.<br></blockquote><div><br></div><div>Excuse me? I know list comprehensions, lambdas and argument unpacking. And I do not think you can see what I do before I post a message. If so, you could see me googling before writing about something that I don't know very well or I don't remember very well. So don't guess about what I do or not do or know and not know, thank you.<br>

</div><div>About pattern matching in the for statement, I really don't know what they are.<br><br><br><div></div><blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex" class="gmail_quote">

<div>... and? Are you suggesting that
 if the switch expression is a string and the case expression a compiled
 regex you could automatically call match instead of testing for 
equality? If not, how is having regexp even relevant here? And how are 
recursive functions relevant?</div></blockquote><br></div><div>I'm suggesting to use <span style="font-family:courier new,monospace">if-elif</span> with <span style="font-family:courier new,monospace">re</span> module, if you want to use regular expression, and to use recursive functions if you want... recursive functions. To be more clear, IMHO switch-case is useful if it's simple.<br>

<br><br><blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex" class="gmail_quote">A generator expression is equal to anything except itself, and doesn't contain anything.<br>

</blockquote><div><br></div><div>You can convert it to an iterable. Probably an overkill, but you can do it. <br><br><br><blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex" class="gmail_quote">

I don't know what you mean by "symbolic pattern" here.<br></blockquote><div><br></div><div>For what I know (not too much), in Mathematica pattern matching can be used for symbols, and symbols can be used as identifiers:<br>

<a href="https://reference.wolfram.com/mathematica/guide/Patterns.html">https://reference.wolfram.com/mathematica/guide/Patterns.html</a><br></div></div></div></div></div></div></div></div></div>