Thanks for the reply.

As far as I can tell, I have found a difference in Clipper and Harbour in
terms of these evaluations.  But as I said earlier, I could be completely
mistaken.  I have done a lot of little tests to check the -z flag but
unfortunately I'm not that good at Clipper as one of my friends is.  (I'm
better at Perl, etc).  But if I can demonstrate the problem in a small Hello
World type example, I will post it, to try to figure out what is happening,
with your help.  :)  The only reason I bring this up, is because I am trying
to compile an old DOS16 app and it is behaving differently on these .or.
lines.

Thanks again for reading!!!  I have read your informative reply, and will
test what you said out for myself to try to figure out what is going on.


2010/1/28 Przemysław Czerpak <dru...@acn.waw.pl>

> On Thu, 28 Jan 2010, smu johnson wrote:
>
> Hi!
>
> > I noticed the -z switch allows to stop using shortcuts for .and. and .or.
> > Clipper conditions.
> > Without -z, if I do:
> > eval(something) .or. .t. // will recognize that it's already true, and
> not
> > make the eval
> > When -z is enabled:
> > .f. .and. eval(something) // will try to eval 'something', despite the
> fact
> > that .f. already failed.
>
> Exactly just like in Clipper.
>
> > ... If what I said is actually true, is there any sort of secondary -z
> > switch that can be done to make it simply not be lazy, yet fail on first
> > condition?
>
> It's default behavior. Just simply do not use -z or better use the same
> switches as in Clipper.
>
> > ... If what I said is complete nonsense and complete BS, I will have to
> go
> > through the code I'm trying to compile that someone else wrote and see
> > what's up.  By the way, I realize that the above examples are not the
> best
> > way to do things... and I sure as heck wouldn't do it that way myself.
>  Just
> > trying to get some existing Clipper functioning code to behave the same
> way
> > in Harbour.
>
> You mixed two different things which confuse you:
>   1. compile time optimizations
>   2. lazy boolean expression evaluation
>
> Both Harbour and Clipper support -z switch to control lazy expression
> evaluation. It works in the same way. This code illustrate it:
>
>   proc main()
>      local f:=.F., t:=.T.
>      ?; ?? .t. .or.  f()
>      ?; ?? .f. .and. f()
>      ?; ?? f() .or.  .t.
>      ?; ?? f() .and. .f.
>      ?
>      ?; ??  t  .or.  f()
>      ?; ??  f  .and. f()
>      ?; ?? f() .or.   t
>      ?; ?? f() .and.  f
>      ?
>   return
>   func f()
>      ?? "[F()] "
>   return .T.
>
> compile it with and without -z switch using Harbour and Clipper and
> compare results. Please note that when -z is not used then first 4
> expressions are optimized at compile time and next 4 ones are optimized
> at runtime. Compile time optimization calculates final result and
> replace the code with simple .F. or .T. so F() function is never
> execute. It's also Clipper compatible behavior.
> Anyhow Clipper does not optimize all expressions (i.e. it does not
> optimize <exp> if message is send to it: <exp>:msg()) and cannot strip
> parenthesis in optimization process. Harbour does not make any exceptions
> here and optimize all end everywhere if it's possible what seems to be
> correct behavior. You can add these lines to above test to see the
> difference:
>
>   ?; ?? (.t.) .or.  f()
>   ?; ?? (.f.) .and. f()
>   ?; ?? f() .or.  (.t.)
>   ?; ?? f() .and. (.f.)
>   ?
>   ?; ?? ( .t. .or.  f() ):classname
>   ?; ?? ( .f. .and. f() ):classname
>   ?; ?? ( f() .or.  .t. ):classname
>   ?; ?? ( f() .and. .f. ):classname
>   ?
>
> compile it without -z switch and compare Clipper and Harbour results.
> If you want to replicate also this Clipper behavior then you can use
> -kc switch which disables all Harbour extensions though I cannot promise
> that we located all places were Clipper does not make compile time
> optimization and added necessary protection for -kc switch. If you will
> find sth then please inform us. We try to cover it by -kc switch or
> document the difference. Such missing optimizations in chosen places
> for me are bugs which should be eliminated to not create some hidden
> and not understandable for users exception so I've never tried to make
> precise test to detect all such Clipper anomalies.
> If you want to read more about compile time optimizations then read
> docs/cmpopt.txt
>
> best regards,
> Przemek
> _______________________________________________
> Harbour mailing list (attachment size limit: 40KB)
> Harbour@harbour-project.org
> http://lists.harbour-project.org/mailman/listinfo/harbour
>



-- 
smu johnson <smujohn...@gmail.com>
_______________________________________________
Harbour mailing list (attachment size limit: 40KB)
Harbour@harbour-project.org
http://lists.harbour-project.org/mailman/listinfo/harbour

Reply via email to