Does not understand message inconsistency

AK
Aik-Siong Koh
Fri, Jun 27, 2025 7:00 PM

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

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
DS
Daniel Slomovits
Fri, Jun 27, 2025 7:11 PM

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 askoh@askoh.com 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
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 <askoh@askoh.com> 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 >
AK
Aik-Siong Koh
Fri, Jun 27, 2025 8:44 PM

"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 <askoh@askoh.com
mailto:askoh@askoh.com> 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
"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 <askoh@askoh.com > <mailto:askoh@askoh.com>> 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 >
DS
Daniel Slomovits
Sat, Jun 28, 2025 11:43 PM

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 askoh@askoh.com 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 askoh@askoh.com 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
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 <askoh@askoh.com> 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 <askoh@askoh.com> 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 >> > >