<div dir="ltr"><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff">Hi all, just another wild idea.</div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff"><br></div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff">I've been working a lot with PHP lately (boo!), and one of the things I have a love-hate relationship with in it is its string concatenation operator: .</div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff">Counter-intuitively to Python, `.` is used to concatenate strings; `"str1" . "str2"` evaluates to `"str1str2"`.</div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff">Even though it's kind of weird, I find the separation between addition and concatenation useful. In PHP, `"str1" + "str2"` evaluates to 0; `"str1" . "str2"` evaluates to `"str1str2"`. Obviously, in Python, `"str1" + "str2"` could not evaluate to 0, it should instead raise a TypeError. But it's more clear what is going on here:</div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff"><br></div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff">    $content .= "foobar";</div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff">    $i += 1;</div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff"><br></div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff">than here:</div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff"><br></div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff">    content += "foobar"</div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff">    i += 1</div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff"><br></div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff">I propose adding a dedicated operator for string concatenation. I don't propose `.` as that operator - that would break too much. My initial idea is to abuse the @ operator introduced for matrix multiplication to work for string concatenation when applied to strings. This would be an example result of that:</div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff"><br></div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff">    >>> from numpy import matrix</div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff">    >>> matrix('1 2; 3 4') @ matrix('4 3; 2 1')</div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff">    [[ 8  5]</div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff">     [20 13]]</div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff">    >>> "str1" @ "str2"</div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff">    "str1str2"</div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff">    >>> "str1" @ 56 #str() is called on 56 before concatenating</div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff">    "str156"</div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff">    >>> 56 @ "str1" #str would also have __rmatmul__</div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff">    "56str1"</div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff">    >>> content = "foobar"</div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff">    >>> content @= "bazbang"</div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff">    >>> content @= "running out of ideas"</div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff">    >>> content</div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff">    'foobarbazbangrunning out of ideas'</div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff"><br></div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff">However, the operator does not necessarily have to be @ - I merely picked that because of its lack of use outside matrix math.</div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff"><br></div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff">What are your thoughts?</div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff"><br></div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff">Sincerely,</div><div class="gmail_default" style="font-family:monospace,monospace;font-size:small;color:#0000ff">Ken Hilton;<br><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><font color="#0000ff" face="monospace, monospace"></font><br></div></div></div></div></div></div></div></div></div></div>