<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><meta content="text/html;charset=UTF-8" http-equiv="Content-Type"></head><body ><div style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10pt;"><div>heh.<br></div><div><br></div><div>Awesome! <br></div><div><br></div><div>Thank you.<br></div><div><br></div><div>I will test this in the coming days and understand it.<br></div><div><br></div><div>For my immediate task this would be pre-mature optimization within the larger scope of work I am still cobbling together.<br></div><div><br></div><div>I will definitelly add this to the SqueakHOWTO's later this week, possibly by tomorrow.<br></div><div><br></div><div>t</div><div><br></div><div class="zmail_extra_hr" style="border-top: 1px solid rgb(204, 204, 204); height: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 0px;"><br></div><div class="zmail_extra" data-zbluepencil-ignore="true"><br><div id="Zm-_Id_-Sgn1">---- On Sat, 27 Nov 2021 12:50:10 -0500 <b>Eliot Miranda <eliot.miranda@gmail.com></b> wrote ----<br></div><br><blockquote style="margin: 0px;"><div><div dir="ltr"><div dir="ltr"><div class="x_-470843493gmail_default" style="font-size :  small;"><br></div></div><br><div class="x_-470843493gmail_quote"><div dir="ltr" class="x_-470843493gmail_attr">On Sat, Nov 27, 2021 at 9:47 AM Eliot Miranda <<a href="mailto:eliot.miranda@gmail.com" target="_blank">eliot.miranda@gmail.com</a>> wrote:<br></div><blockquote class="x_-470843493gmail_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="x_-470843493gmail_quote"><div dir="ltr" class="x_-470843493gmail_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="x_-470843493gmail_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="x_-470843493gmail-m_4825774977216382821gmail-m_8089767461623304604divtagdefaultwrapper" style="font-size :  12pt; color :  rgb(0,0,0); font-family :  Calibri, Helvetica, sans-serif;" dir="ltr"><p><span class="size" 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><br></p><p><span><br></span></p><p>Maybe also this one if the identity of the matching pattern is of interest:<br></p><p><br></p><p><span class="font" style="font-family:Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols"><span class="size" style="font-size:16px">{ '{|'  . '|-' . '|}' . '{{' . '}}' .  '[[' . ']]' . '__' . '=='
 . '::' . '**' . '##' . '''' }</span></span><br></p><p><span class="font" style="font-family:Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols"><span class="size" style="font-size:16px">    detect: [:pattern | self match: pattern]</span></span><br></p><p><span class="font" style="font-family:Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols"><span class="size" style="font-size:16px">    ifFound: [:pattern | self inform: 'Matched pattern: ' , pattern]</span></span><br></p><p><span class="font" style="font-family:Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols"><span class="size" style="font-size:16px">    ifNone: [self inform: 'no match']</span></span><br></p><p><span class="font" style="font-family:Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols"><span class="size" style="font-size:16px"><br></span></span></p><p><span class="font" style="font-family:Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols"><span class="size" style="font-size:16px">Best,</span></span><br></p><p><span class="font" style="font-family:Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols"><span class="size" style="font-size:16px">Christoph</span></span><br></p><p><span class="font" style="font-family:Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols"><span class="size" style="font-size:16px"><br></span></span></p><p><span class="font" style="font-family:Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols"><span class="size" style="font-size:16px">PS: Don't use #| unless you explicitly want every method to be
 invoked always. Use #or:... instead, this is faster.</span></span><br></p></div></div></blockquote><div><span class="size" style="font-size:18px"><br></span></div><div><span class="size" style="font-size:18px">And just as importantly, never use a brace construct when a literal array will do.  <span class="colour" style="color:rgb(0, 0, 0)"><span class="font" style="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></span>#('{|' '|-' '|}' '{{' '}}' '[[' ']]' '__' '==' '::' '**' '##' '''')  is created at compile-time.  Inspect the method in the browser or the debugger and have a look at the bytecode.</span><br></div><div><span class="size" style="font-size:18px"><br></span></div><span class="size" style="font-size:18px"><span class="x_-470843493gmail_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="x_-470843493gmail_default">ce).</span></span></div><div class="x_-470843493gmail_quote"><span class="size" style="font-size:18px"><br>| patterns first second Firsts Seconds |</span><br><span class="size" style="font-size:18px">patterns :=  #('{|' '|-' '|}' '{{' '}}' '[[' ']]' '__' '==' '::' '**' '##' '''')<span class="size" style="font-size:small"></span>.</span></div><div class="x_-470843493gmail_quote"><span class="size" style="font-size:18px">Firsts ifNil:</span><br><span class="size" style="font-size:18px"> <span class="size" style="font-size:small">    </span>[Firsts := (patter</span><span class="size" style="font-size:small">n</span><span class="size" style="font-size:18px">s collect: #first) as: String.</span><br><span class="size" style="font-size:18px"> <span class="size" style="font-size:small">     </span>Seconds  := (patterns collect: #second) as: String].</span><br><span class="size" style="font-size:18px">self size >= 2</span><br><span class="size" style="font-size:18px">and: [(Firsts includes: (first := self first))</span><br><span class="size" style="font-size:18px">and: [(Seconds includes: (second := sef second)</span><br><div><span class="size" style="font-size:18px">and: [patterns includes: (ByteString with: first with: second)]]]</span><br></div></div></div></blockquote><div><span class="size" style="font-size:18px"><br></span></div><div class="x_-470843493gmail_default"><span class="size" style="font-size:18px">Oops.  I meant of course</span><br></div><div class="x_-470843493gmail_quote" style="color :  rgb(0,0,0);"><span class="size" style="font-size:18px">| patterns first second Firsts Seconds |<br>patterns :=  #('{|' '|-' '|}' '{{' '}}' '[[' ']]' '__' '==' '::' '**' '##' '''')<span class="x_-470843493gmail_default"></span>.</span></div><div class="x_-470843493gmail_quote" style="color :  rgb(0,0,0);"><span class="size" style="font-size:18px">Firsts ifNil:<br><span class="x_-470843493gmail_default">   </span>[Firsts := <span class="x_-470843493gmail_default">(</span>(patter<span class="x_-470843493gmail_default">n</span>s collect: #first) as: <span class="x_-470843493gmail_default">Set) as: </span>String.<br><span class="x_-470843493gmail_default">   <span class="x_-470843493gmail-Apple-converted-space"> </span></span>Seconds  := (<span class="x_-470843493gmail_default">(</span>patterns collect: #second) as: <span class="x_-470843493gmail_default">Set) as: </span>String].<br>self size >= 2<br>and: [(Firsts includes: (first := self first))<br>and: [(Seconds includes: (second := sef second)<br></span></div><div class="x_-470843493gmail_default"><span class="size" style="font-size:18px"><span class="colour" style="color:rgb(0, 0, 0)">and: [patterns includes: (ByteString with: first with: second)]]]</span></span><br></div><div class="x_-470843493gmail_default"><span class="size" style="font-size:18px"><br></span></div><blockquote class="x_-470843493gmail_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="x_-470843493gmail_quote"><div><span class="size" style="font-size:18px"><br></span></div><blockquote class="x_-470843493gmail_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="x_-470843493gmail-m_4825774977216382821gmail-m_8089767461623304604divtagdefaultwrapper" style="font-size :  12pt; color :  rgb(0,0,0); font-family :  Calibri, Helvetica, sans-serif;" dir="ltr"><br></div><hr style="display :  inline-block; width :  98%;"><div id="x_-470843493gmail-m_4825774977216382821gmail-m_8089767461623304604divRplyFwdMsg" dir="ltr"><span class="font" style="font-family:Calibri, sans-serif"><span class="colour" style="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?</span></span> <div> <br></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<br></div></div><br></div></div><br></blockquote></div><br><div><br></div>-- <br><div dir="ltr"><div dir="ltr"><div><span class="size" style="font-size: small; border-collapse: separate;"><div>_,,,^..^,,,_<br></div><div>best, Eliot<br></div></span></div></div></div></div></blockquote></div><br><div><br></div>-- <br><div dir="ltr" class="x_-470843493gmail_signature"><div dir="ltr"><div><span class="size" style="font-size: small; border-collapse: separate;"><div>_,,,^..^,,,_<br></div><div>best, Eliot<br></div></span></div></div></div></div><br></div></blockquote></div><div><br></div></div><br></body></html>