<div dir="ltr"><div dir="ltr"><div class="gmail_default" style="font-size:small"><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, Nov 27, 2021 at 9:47 AM Eliot Miranda <<a href="mailto:eliot.miranda@gmail.com">eliot.miranda@gmail.com</a>> wrote:<br></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"><div dir="ltr"><div dir="ltr"><div style="font-size:small"><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, Nov 27, 2021 at 8:36 AM Thiede, Christoph <<a href="mailto:Christoph.Thiede@student.hpi.uni-potsdam.de" target="_blank">Christoph.Thiede@student.hpi.uni-potsdam.de</a>> wrote:<br></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"><u></u>




<div>

<div id="gmail-m_4825774977216382821gmail-m_8089767461623304604divtagdefaultwrapper" style="font-size:12pt;color:rgb(0,0,0);font-family:Calibri,Helvetica,sans-serif" dir="ltr">
<p><span style="font-size:12pt">What about</span><br>
</p>
<p><br>
</p>
<p><span>{ '{|'  . '|-' . '|}' . '{{' . '}}' .  '[[' . ']]' . '__' . '==' . '::' . '**' . '##' . '''' } anySatisfy: [:pattern | self match: pattern]</span><br>
</p>
<p><span><br>
</span></p>
<p><span>?</span></p>
<p><span><br>
</span></p>
<p>Maybe also this one if the identity of the matching pattern is of interest:</p>
<p><br>
</p>
<p><span style="font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols;font-size:16px">{ '{|'  . '|-' . '|}' . '{{' . '}}' .  '[[' . ']]' . '__' . '=='
 . '::' . '**' . '##' . '''' }</span></p>
<p><span style="font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols;font-size:16px">    detect: [:pattern | self match: pattern]</span><br>
</p>
<p><span style="font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols;font-size:16px">    ifFound: [:pattern | self inform: 'Matched pattern: ' , pattern]</span></p>
<p><span style="font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols;font-size:16px">    ifNone: [self inform: 'no match']</span></p>
<p><span style="font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols;font-size:16px"><br>
</span></p>
<p><span style="font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols;font-size:16px">Best,</span></p>
<p><span style="font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols;font-size:16px">Christoph</span></p>
<p><span style="font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols;font-size:16px"><br>
</span></p>
<p><span style="font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols;font-size:16px">PS: Don't use #| unless you explicitly want every method to be
 invoked always. Use #or:... instead, this is faster.</span></p></div></div></blockquote><div><font size="4"><br></font></div><div><font size="4">And just as importantly, never use a brace construct when a literal array will do.  <span style="color:rgb(0,0,0);font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">{ '{|'  . '|-' . '|}' . '{{' . '}}' .  '[[' . ']]' . '__' . '==' . '::' . '**' . '##' . '''' } is created at run-time.  The equivalent </span>#('{|' '|-' '|}' '{{' '}}' '[[' ']]' '__' '==' '::' '**' '##' '''')  is created at compile-time.  Inspect the method in the browser or the debugger and have a look at the bytecode.</font></div><div><font size="4"><br></font></div><font size="4"><span class="gmail_default">If performancer is important you'll construct a parser of some form.  For example, the simplest optimization here is to check if the first character is a candidate and then if the second character is a candidate.  In a parser you'd have different code executed for each first character candidate.  But the below avoids doing a match until we know both characters are in the set.  I've written it as a doit bit I'm imagining Firsts and Seconds are class or instance variables (the issue here is provided the matcher is called often we want Firsts and Seconds to be computed precisely on</span><span class="gmail_default">ce).</span></font></div><div class="gmail_quote"><font size="4"><br>| patterns first second Firsts Seconds |</font><br><font size="4">patterns :=  #('{|' '|-' '|}' '{{' '}}' '[[' ']]' '__' '==' '::' '**' '##' '''')<span class="gmail_default" style="font-size:small"></span>.</font></div><div class="gmail_quote"><font size="4">Firsts ifNil:</font><br><font size="4">     <span class="gmail_default" style="font-size:small">    </span>[Firsts := (patter</font><span class="gmail_default" style="font-size:small">n</span><font size="4">s collect: #first) as: String.</font><br><font size="4">  <span class="gmail_default" style="font-size:small">     </span>Seconds  := (patterns collect: #second) as: String].</font><br><font size="4">self size >= 2</font><br><font size="4">and: [(Firsts includes: (first := self first))</font><br><font size="4">and: [(Seconds includes: (second := sef second)</font><br><div><font size="4">and: [patterns includes: (ByteString with: first with: second)]]]</font></div></div></div></blockquote><div><font size="4"><br></font></div><div class="gmail_default"><font size="4">Oops.  I meant of course</font></div><div class="gmail_quote" style="color:rgb(0,0,0)"><font size="4">| patterns first second Firsts Seconds |<br>patterns :=  #('{|' '|-' '|}' '{{' '}}' '[[' ']]' '__' '==' '::' '**' '##' '''')<span class="gmail_default"></span>.</font></div><div class="gmail_quote" style="color:rgb(0,0,0)"><font size="4">Firsts ifNil:<br><span class="gmail_default">   </span>[Firsts := <span class="gmail_default">(</span>(patter<span class="gmail_default">n</span>s collect: #first) as: <span class="gmail_default">Set) as: </span>String.<br><span class="gmail_default">   <span class="gmail-Apple-converted-space"> </span></span>Seconds  := (<span class="gmail_default">(</span>patterns collect: #second) as: <span class="gmail_default">Set) as: </span>String].<br>self size >= 2<br>and: [(Firsts includes: (first := self first))<br>and: [(Seconds includes: (second := sef second)<br></font></div><div class="gmail_default"><font size="4"><span style="color:rgb(0,0,0)">and: [patterns includes: (ByteString with: first with: second)]]]</span></font></div><div class="gmail_default"><font size="4"><br></font></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"><div dir="ltr"><div class="gmail_quote"><div><font size="4"><br></font></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"><div><div id="gmail-m_4825774977216382821gmail-m_8089767461623304604divtagdefaultwrapper" style="font-size:12pt;color:rgb(0,0,0);font-family:Calibri,Helvetica,sans-serif" dir="ltr">
</div>
<hr style="display:inline-block;width:98%">
<div id="gmail-m_4825774977216382821gmail-m_8089767461623304604divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>Von:</b> Squeak-dev <<a href="mailto:squeak-dev-bounces@lists.squeakfoundation.org" target="_blank">squeak-dev-bounces@lists.squeakfoundation.org</a>> im Auftrag von gettimothy via Squeak-dev <<a href="mailto:squeak-dev@lists.squeakfoundation.org" target="_blank">squeak-dev@lists.squeakfoundation.org</a>><br>
<b>Gesendet:</b> Samstag, 27. November 2021 17:30:38<br>
<b>An:</b> squeak-dev<br>
<b>Betreff:</b> [squeak-dev] Anybody got an elegent construct for this functional monstrosity?</font>
<div> </div>
</div>
<div>
<div style="font-family:Verdana,Arial,Helvetica,sans-serif;font-size:10pt">
<div>I have a ReadStream and I want to detect some substrings in it.<br>
</div>
<div><br>
</div>
<div>This works, but it is ugly.<br>
</div>
<div><br>
</div>
<div><br>
</div>
<div>
<blockquote style="border:1px solid rgb(204,204,204);padding:7px;background-color:rgb(245,245,245)">
<div>((self match:'{|') | <br>
</div>
<div>(self match:'|-') |<br>
</div>
<div>(self match:'|}') |<br>
</div>
<div>(self match:'{{') |<br>
</div>
<div>(self match:'}}') |<br>
</div>
<div>(self match:'[[') |<br>
</div>
<div>(self match:']]') |<br>
</div>
<div>(self match:'__') |<br>
</div>
<div>(self match:'==') |<br>
</div>
<div>(self match:'::') |<br>
</div>
<div>(self match:'**') |<br>
</div>
<div>(self match:'##') |<br>
</div>
<div>(self match:'''') )<br>
</div>
</blockquote>
<br>
</div>
<div>Is anybody aware of an elegant approach to this?<br>
</div>
<div><br>
</div>
<div><br>
</div>
<div>Something along the lines of <br>
</div>
<div><br>
</div>
<div><br>
</div>
<div>
<blockquote style="border:1px solid rgb(204,204,204);padding:7px;background-color:rgb(245,245,245)">
<div>self matchAny: { '{|'  . '|-' . '|}' . '{{' . '}}' .  '[[' . ']]' . '__' . '==' . '::' . '**' . '##' . '''' }<br>
</div>
</blockquote>
<br>
</div>
<div><br>
</div>
<div>thx in advance</div>
</div>
<br>
</div>
</div>

<br>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr"><div dir="ltr"><div><span style="font-size:small;border-collapse:separate"><div>_,,,^..^,,,_<br></div><div>best, Eliot</div></span></div></div></div></div>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div><span style="font-size:small;border-collapse:separate"><div>_,,,^..^,,,_<br></div><div>best, Eliot</div></span></div></div></div></div>