Ralf Hemmecke <[EMAIL PROTECTED]> writes:

| On 05/14/2008 05:26 PM, Gabriel Dos Reis wrote:
| > Waldek Hebisch <[EMAIL PROTECTED]> writes:
| > | Gabriel Dos Reis wrote:
| > | > | > The definition of the function recip$NormalizationPackage
| > elicites
| > | > a `semantic error' from the compiler because the local variable
| > | > `hesrg' is defined in the two branches of an if-statement with two
| > | > differen types.  That looks like a bug to me.  Opinion?
| > | > | >      recip(p:P,ts:TS): Record(num:P, den:P) ==
| > | >      -- ASSUME p is invertible w.r.t. ts
| > | >      -- ASSUME mvar(p) is algebraic w.r.t. ts
| > | >        v := mvar(p)
| > | >        ts_v := select(ts,v)::P
| > | >        if mdeg(p) < mdeg(ts_v)
| > | >          then
| > | >            hesrg: Record (gcd : P, coef2 : P)  := 
halfExtendedSubResultantGcd2(ts_v,p)$P
| > | >            d: P :=  hesrg.gcd; n: P := hesrg.coef2
| > | >          else
| > | >            hesrg: Record (gcd : P, coef1 : P) := 
halfExtendedSubResultantGcd1(p,ts_v)$P
| > | >            d: P :=  hesrg.gcd; n: P := hesrg.coef1
| > | >        g := gcd(n,d)
| > | >        (n, d) := ((n exquo g)::P, (d exquo g)::P)
| > | >        remn, remd: Record(rnum:R,polnum:P,den:R)
| > | >        remn := remainder(n,ts); remd := remainder(d,ts)
| > | >        cn := remn.rnum; pn := remn.polnum; dn := remn.den
| > | >        cd := remd.rnum; pd := remd.polnum; dp := remd.den
| > | >        k: K := (cn / cd) * (dp / dn)
| > | >        pn := removeZero(pn,ts)
| > | >        pd := removeZero(pd,ts)
| > | >        [numer(k) * pn, denom(k) * pd]$Record(num:P, den:P)
| > | > | > | | I belive that Axiom creators considered this function
| > legal,
| > | so generating error message would be a bug.
| > Hmm, could you give me hints at to why they considered the function
| > legal?
| 
| Gaby, this case looks so simple. Rename hesrg in the "then" branch to
| hesrg2 and to hesrg1 in the "else" branch.

This *particular* case looks simple; I agree.  However, I suspect my
question is more about the *pattern* of the code.  Said differently,
is this type of code, something that should be valid?  (Waldek says
`no', and I tend to agree with him, but for different reasons).

| Do you really think because of code such as this, you would have to
| introduce separate scopes for "then" end "else"?

This is a separate issue.  
It is certainly helped by having separate scope for each branches.
As you note below, the variable is local to each branch, so why not
make that supported by the compiler?

| The variable hesrg is completely local to each of the branches
| respectively. It is not needed outside the "if".

That is not correct for the current compiler point of view (all
AXIOMs) -- but it is correct at the `conceptual' level.  The question is
whether we should have the compiler match the conceptual understanding.
| 
| The code is legacy stuff and is wrong (as you pointed out) because the
| compiler did not signal an error.

Again, as I said in the original mail, the compiler *did signal* an
error.  What the compiler did not do was to stop producing a object
file.  But, the compiler did definitely produce an error.

| Because there is no error from the
| compiler, the creators probably thought that everything is OK. Of
| course, that does not mean that the code is without bugs.

I believe nobody paid attention to the `semantic error' because an
object file was produced.  And to this date, we all ship AXIOM
derivatives without paying attention to the `semantic errors'.

-- Gaby

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft 
Defy all challenges. Microsoft(R) Visual Studio 2008. 
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
open-axiom-devel mailing list
open-axiom-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open-axiom-devel

Reply via email to