There is a bit of confusion around the word "understand" here. It is
sensible to think of an object as "understanding" a message or not, but in
fact the selector that tells you whether an object understand a message is
#respondsTo:, while the equivalent on the class which tells you whether
instances of that class understand is the one that's actually called
#canUnderstand:. Other Smalltalk dialects simply say "ReadWriteStream does
not understand #selector", no "a[n]" or "Instance of". (I like the use of
present tense "does not" instead of past-tense "did not", as well, but
that's a much more nitpicky personal preference.)

This is in fact already what you are doing with your class-side example, as
`PragmaMenuBuilder class` is in fact not the class (that's just
`PragmaMenuBuilder`), but the class *of* the class, itself an instance of
`Metaclass`.

On Fri, Jun 27, 2025 at 4:45 PM Aik-Siong Koh <[email protected]> wrote:

> "nil did not understand #selector" is great.
>
> Similarly, "Instance of " can be replace by "a" as in
> "aObject did not understand #selector"
> "aReadWriteStream did not understand #selector"
>
> For classes
> "PragmaMenuBuilder class did not understand #selector"
>
>
> Daniel Slomovits wrote:
>
> I think it's because nil *is* pretty special--this is the equivalent of a
> NullPointerException or similar in other languages (even though in fact nil
> is an object like any other, it *is* usually a different type of *semantic*
> error on the part of the programmer than with any other class).
> UndefinedObject is also a pretty long class name, so it's nice to leave
> that out. But I would be all in favor of making it "nil did not understand
> #selector", to be more consistent but still concise.
>
> On Fri, Jun 27, 2025, 3:00 PM Aik-Siong Koh <[email protected]> wrote:
>
>> Why is UndefinedObject version of "did not understand" so different from
>> others?
>> It also inverts the object message paradigm.
>> Thanks
>> Aik-Siong Koh
>>
>> description
>>
>>      "Returns a textual description of the exception (based on the
>> message instance variable). If message is nil, it returns the
>> defaultDescription instead."
>>
>>      message ifNil: [ ^ self defaultDescription ].
>>      message lookupClass == UndefinedObject ifTrue: [
>>          ^ message selector printString , ' was sent to nil' ].
>>
>>      ^ 'Instance of ' , message lookupClass printString
>>        , ' did not understand ' , message selector printString
>>
>
>

Reply via email to