The idea in Smalltalk is to push a method as high as makes sense
and no higher, so that if you send a message to an object where it
really does not make sense (like trying to add two strings) you
get a runtime failure.  (Try asking an old-timer about automatic
conversions in PL/I some time.)  Now Lisp *did* define NIL=false,
anything else=true, and Lisp came before Smalltalk, and you can
bet the designers of Smalltalk knew about this possibility.

As a particular example, I seem to forget to initialise variables
embarrassingly often, and having x ifTrue: ... ifFalse: ... fail
noisily because x was still nil has made my life simpler too often.


On 20 March 2018 at 02:16, Petr Fischer <petr.fisc...@me.com> wrote:

> That sounds correct. In this context, my "universal ifTrue:" is really
> terrible idea.
>
> Thanks for clarification! pf
>
>
> > Why would you do such aberration?
> >
> > It goes against the "fail noisily" "Rule of Repair": Developers should
> > design programs that fail in a manner that is easy to localize and
> > diagnose or in other words “fail noisily”. This rule aims to prevent
> > incorrect output from a program from becoming an input and corrupting
> > the output of other code undetected.
> >
> > It is semantically incorrect, if needed, I don't see why, you sould
> > implement it in  your own class. But when I needed to do such "if"
> > handlers, I did it using meaningful selectors like #ifGranted: or
> > #ifSucceeded:, or the well known #ifEmpty:
> >
> > Regards,
> >
> > Esteban A. Maringolo
> >
> >
> > 2018-03-19 9:40 GMT-03:00 Petr Fischer <petr.fisc...@me.com>:
> > >> Infinite recursion ?
> > >>
> > >> You use #ifTrue: in your implementation of Object>>#ifTrue:
> > >>
> > >> Plus, non-booleans cannot meaningfully respond.
> > >>
> > >> How would you define the semantics of
> > >>
> > >> 123 ifTrue: [ ... ]
> > >
> > > 123 is not "true", so, ignore the block.
> > > Do the ifTrue block only if the receiver is instance of True (true).
> Everything else is not "true" :)
> > >
> > > I missed the recursion, yes, but it could be done another way.
> > >
> > >>
> > >> > On 19 Mar 2018, at 10:18, Petr Fischer <petr.fisc...@me.com> wrote:
> > >> >
> > >> > Hello, I have some sort of philosophical question about
> ifTrue:/ifFalse: implementation.
> > >> >
> > >> > Now, ifTrue: is defined in the Boolean class
> (subclassResponsibility) + in True and False classes, so, we can send this
> message to the boolean expressions (instances) only, otherwise DND occurs.
> > >> >
> > >> > But we can also define one universal ifTrue: right in the Object
> class, in this style:
> > >> >
> > >> > Object>>ifTrue: ....
> > >> >     (self = true) ifTrue: [ ... ].
> > >> >
> > >> > then, we can send ifTrue: message to ANY object and it will work
> correctly without DND exception on non-boolean objects.
> > >> >
> > >> > Is something bad about this idea?
> > >> >
> > >> > Thanks! pf
> > >> >
> > >>
> > >>
> > >
> >
>
>

Reply via email to