Thx for those reviews. And interesting paper.
Phil On Sat, Dec 15, 2018, 04:20 Richard O'Keefe <rao...@gmail.com wrote: > Starting from the top:\ > (0) It's not *wrong* to start a selector with a capital letter, but > it is certainly unusual. > (1) Intention-revealing names are good. That's why this name is bad. > It does not *delete* anything. > (2) The comment again says "delete" but nothing is deleted. Comments > that mislead are worse than no comments. > (3) An issue I have seen over and over in student code (in other > programming languages) is writing regular expressions as string > literals where they are used, so that every time you try a match > the regular expression gets recompiled, over and over again. > You're not exactly doing that, but you *are* rebuilding patterns > over and over again. It would make more sense to hold a > forbiddenPatterns collection. > (4) You are saying "(coll reject: [..test..]) notEmpty", building an > entire collection just to ask whether it has any members. What > you want to know is "are there any elements of coll that do not > satisfy the test", which can be expressed as > (coll allSatisfy: [..test..]) not. (Sadly there is no > #notAllSatisfy:, although #notAnySatisfy: *does* exist under the > name #noneSatisfy:. > (5) #match: is a highly risky way to look for a substring. What if > you want to look for a literal # or * ? What if you need to > look for 'Boring' but not 'boring'? ("Boring" is a perfectly > good surname.) > (6) You really don't need the "result" variable. > > allowedWords > "Answer those words which do not contain any forbiddenWord > as a substring." > ^words select: [:each | > forbiddenWords noneSatisfy: [:forbidden | > <<each includes forbidden as a substring>>]] > > (7) You can find out how to do the <<part>> by looking at the methods > for String. You will find several candidate methods. > (8) Of course, if there are W words and F forbidden words, in the > worst case you'll do W*F substring inclusion tests. This is not > good. "Multiple pattern matching" is a much-studied problem, > see for example Wu and Manber's paper > > http://web.archive.org/web/20130203031412/http://www.inf.fu-berlin.de/inst/ag-bio-expired/FILES/ROOT/Teaching/Lectures/WS0506/WeiterfThemenBioinf/papers/FastAlgorithmMultiPatternSearching-WuManbers-TR94.pdf > There is more recent work also. > > Does anyone know whether there's a multiple pattern algorithm for > Pharo? One could always fall back on ternary search trees... > > > > On Fri, 14 Dec 2018 at 05:13, Roelof Wobben <r.wob...@home.nl> wrote: > >> Hello, >> >> I have this code : >> >> FindAndDeleteWordsWithForbiddenParts >> "deletes all the words that contain forbidden parts" >> >> | result | >> result := words >> select: [ :word | >> [ (forbiddenWords reject: [ :forbidden | '*' , forbidden , '*' >> match: word ]) isNotEmpty ] >> on: NotFound >> do: [ false ] ]. >> ^ result >> >> >> but I see warnings that I have to use a stream instead of string >> concentation. >> >> Anyone hints how to do so ? >> >> Roelof >> >> >>