On 05/14/2008 06:27 PM, Gabriel Dos Reis wrote:
> 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).

I think, I have not clearly understood why *you* say that the code is 
invalid. I haven't tested that in Aldor, but even there I would want 
that code to be illegal since (as you said) the variable hesrg is 
created inside the "if" and it is not clear what type it should have 
after the "if". According to the Aldor specification, it is not allowed 
that a variable has different types in the same scope. Since "if" does 
not introduce a new scope, the above code should be as invalid as

x: A := foo1()
x: B := foo2()

As you know Aldor has a difference between Variables and constants.
The following code is OK in Aldor and prints T and 1.

---BEGIN aaa.as
#include "aldor"
#include "aldorio"
foo1(): Integer -> Boolean == (x: Integer): Boolean +-> true;
foo2(): Integer -> Integer == (x: Integer): Integer +-> x;
main(): () == {
        import from Integer;
        x: Integer -> Boolean == foo1();
        x: Integer -> Integer == foo2();
        stdout << x(1)@Boolean << newline;
        stdout << x(1)@Integer << newline;
}
main();
---END aaa.as

However, if you replace "==" by ":=" in the main function, then it again 
applies that a variable cannot have different types in the same scope.

With "==" however, these lines in "main" are (according to the AUG) 
equivalent to

x(a: Integer): Boolean == foo1()(a);
x(a: Integer): Integer == foo2()(a);

I think, you agree that this should be allowed.

> | 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?

I am a legacy guy, you would destroy my understanding of the current 
situation. ;-) But earnestly, I think it is unnecessary. I have never 
felt a need for having an extra scope for if's. Branches should be short 
anyway and if one wants to have more computations inside the "then" and 
"else", why not calling two functions there? That would make the "if" 
shorter and clearer and you get an extra scope inside the function anyway.

> | 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.

I, of course, meant the "conceptual level" here. That hesrg is not 
locals according to current SPAD or Aldor specification is clear.

> The question is
> whether we should have the compiler match the conceptual understanding.

As you have seen in my previous posting, this particular code can be 
made without introducing any "local" variables, if the language is 
strong enough (ie, with multivalues or Cross).

I believe that not having an extra scope for "if" forces the programmer 
to be more careful with the length of the branches. So in some sense I 
believe it makes the code more readable. (... oh oh... I believe...)

> | 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.

OK, but then I agree the compiler should abort the compilation.

Ralf

-------------------------------------------------------------------------
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