And looking at this in the code - there are quite a few variations of #includes��� that I don���t think it makes sense to write the mirror of all of them. Not  it is...

On 18 Mar 2019, at 16:48, Tim Mackinnon <tim@testit.works> wrote:

Thanks guys - I always learn something new from these threads.

On 17 Mar 2019, at 06:56, Richard O'Keefe <raoknz@gmail.com> wrote:

(1) As it happens, my Smalltalk library *does* have
    #excludes: and #identityExcludes:
(2) The definitions are trivial.
    excludes: item
      ^(self includes: item) not
    identityExcludes: item
      ^(self identityIncludes: item) not

If you want to execute aBlock when aString is not all zeros
and ones, just do
   (aString allSatisfy: [:each | each = $0 or: [each = $1]])
     ifFalse: [aBlock value].
or
   (aString anySatisfy: [:each | each ~= $0 and: [each ~= $1]])
     ifTrue: [aBlock value].
or
   ('01' includesAll: aString) ifFalse: [aBlock value].


On Sat, 16 Mar 2019 at 11:33, Tim Mackinnon <tim@testit.works> wrote:
Hi - in my quest to understand the edgier details of Pharo (and Smalltalk) - and driven by fresh thoughts of completing exercism exercises - I was surprised to find that there is no #excludes: operation on collection to mirror the #includes: operation?

I was curious about this - its seems a strange omission?

Of course I can inverse it with not, or do things a different way - but we have ifTrue: mirrored with ifFalse, empty/notEmpty so am I missing something?

I wanted to write something like


aString detect: [:c | ($0 to: $1) excludes: c] ifFound: aBlock. (Evaluate a block if the string isn���t all 0 and 1���s)


Of course I can write this as:

(aString reject: [:c | c = $0 | c = $1)) ifNotEmpty: aBlock

But as recent messages in this vein have shown me (and taught me lots - thanks to those answering), the answer is often not what I thought.

Tim