Trace may affect correct output of 1::EXPR INT . This page should be read in conjunction with IssueTracker #283.
To suppress the infinite loop being displayed till overflow, add )math to the package traced (does not always work). I think the coercion 2/3::FRAC INT is where the main bug lies, but since it is affected by )trace, it may not be easy to find.
We first establish that without )trace , the following works as intended.
fricas
(1) -> 2/3::FRAC INT
Type: Fraction(Integer)
fricas
1::EXPR INT
Type: Expression(Integer)
What led me to suspect that FRAC is involved in the )trace bug is the following trace obtained in a Windows session (but unfortunately, I no longer know the exact set up to reproduce this):
(7) -> 1::EXPR INT
1<enter SparseMultivariatePolynomial.zero?,17 :
arg1= 1
1>exit SparseMultivariatePolynomial.zero?,17 :
false
1<enter Fraction.*,60 : 1\((0 . 1) 0 . 1)
1<enter SparseMultivariatePolynomial.coerce,77 :
arg1= 1
1>exit SparseMultivariatePolynomial.coerce,77 :
1
1<enter SparseMultivariatePolynomial.=,97 :
arg1= 1
arg2= 1
1>exit SparseMultivariatePolynomial.=,97 :
true
1<enter SparseMultivariatePolynomial.*,65 :
arg1= 1
arg2= 1
1<enter SparseMultivariatePolynomial.*,90 :
arg1= 1
arg2= 1
1>exit SparseMultivariatePolynomial.*,90 :
1
1>exit SparseMultivariatePolynomial.*,65 :
1
1<enter SparseMultivariatePolynomial.zero?,17 :
arg1= 1
1>exit SparseMultivariatePolynomial.zero?,17 :
false
1<enter SparseMultivariatePolynomial.=,97 :
arg1= 1
arg2= 1
1>exit SparseMultivariatePolynomial.=,97 :
true
1>exit Fraction.*,60 : ((0 . 1) 0 . 1)
1<enter Fraction.denom,73 : ((0 . 1) 0 . 1)
2<enter Fraction.denom,73 : ((0 . 1) 0 . 1)
3<enter Fraction.denom,73 : ((0 . 1) 0 . 1)
...
The following, surprisingly also works (trying to recreate the above trace, but failed).
fricas
)trace FRAC
Packages traced:
Fraction(Integer), Fraction(SparseMultivariatePolynomial(
Integer,Kernel(Expression(Integer)))), Fraction(
Polynomial(Integer))
Parameterized constructors traced:
FRAC
fricas
)trace SMP )math
Packages traced:
Fraction(Integer), Fraction(SparseMultivariatePolynomial(
Integer,Kernel(Expression(Integer)))), Fraction(
Polynomial(Integer)), SparseMultivariatePolynomial(
Integer,Kernel(Expression(Integer))),
SparseMultivariatePolynomial(Integer,Symbol)
Parameterized constructors traced:
FRAC, SMP
1::EXPR INT
1<enter Fraction.*,64 : 1\(#1=(0 . 1) . #1#)
1<enter SparseMultivariatePolynomial.coerce,98 :
arg1 = 1
1>exit SparseMultivariatePolynomial.coerce,98 :
1
1<enter SparseMultivariatePolynomial.=,32 :
arg1 = 1
arg2 = 1
1>exit SparseMultivariatePolynomial.=,32 :
true
1<enter SparseMultivariatePolynomial.*,79 :
arg1 = 1
arg2 = 1
1<enter SparseMultivariatePolynomial.*,110 :
arg1 = 1
arg2 = 1
1>exit SparseMultivariatePolynomial.*,110 :
1
1>exit SparseMultivariatePolynomial.*,79 :
1
1<enter SparseMultivariatePolynomial.zero?,18 :
arg1 = 1
1>exit SparseMultivariatePolynomial.zero?,18 :
false
1<enter SparseMultivariatePolynomial.=,32 :
arg1 = 1
arg2 = 1
1>exit SparseMultivariatePolynomial.=,32 :
true
1>exit Fraction.*,64 : ((0 . 1) 0 . 1)
1<enter SparseMultivariatePolynomial.=,32 :
arg1 = 1
arg2 = 1
1>exit SparseMultivariatePolynomial.=,32 :
true
1<enter SparseMultivariatePolynomial.retractIfCan,180 :
arg1 = 1
1>exit SparseMultivariatePolynomial.retractIfCan,180 :
1
Type: Expression(Integer)
Here are trace examples that produced Bind Stack Overflow.
fricas
)trace INT
Packages traced:
Fraction(Integer), Fraction(SparseMultivariatePolynomial(
Integer,Kernel(Expression(Integer)))), Fraction(
Polynomial(Integer)), SparseMultivariatePolynomial(
Integer,Kernel(Expression(Integer))),
SparseMultivariatePolynomial(Integer,Symbol), Integer
Parameterized constructors traced:
FRAC, SMP, INT
fricas
)trace FRAC
Packages traced:
SparseMultivariatePolynomial(Integer,Kernel(Expression(
Integer))), SparseMultivariatePolynomial(Integer,
Symbol), Integer, Fraction(Integer), Fraction(
SparseMultivariatePolynomial(Integer,Kernel(
Expression(Integer)))), Fraction(Polynomial(Integer))
Parameterized constructors traced:
SMP, INT, FRAC
fricas
)trace EXPR INT )math
Packages traced:
SparseMultivariatePolynomial(Integer,Kernel(Expression(
Integer))), SparseMultivariatePolynomial(Integer,
Symbol), Integer, Fraction(Integer), Fraction(
SparseMultivariatePolynomial(Integer,Kernel(
Expression(Integer)))), Fraction(Polynomial(Integer))
, Expression(Integer)
Parameterized constructors traced:
SMP, INT, FRAC
fricas
)trace KERNEL EXPR INT
Packages traced:
SparseMultivariatePolynomial(Integer,Kernel(Expression(
Integer))), SparseMultivariatePolynomial(Integer,
Symbol), Integer, Fraction(Integer), Fraction(
SparseMultivariatePolynomial(Integer,Kernel(
Expression(Integer)))), Fraction(Polynomial(Integer))
, Expression(Integer), Kernel(Expression(Integer))
Parameterized constructors traced:
SMP, INT, FRAC
fricas
)trace SMP(INT, KERNEL EXPR INT)
Packages traced:
SparseMultivariatePolynomial(Integer,Kernel(Expression(
Integer))), SparseMultivariatePolynomial(Integer,
Symbol), Integer, Fraction(Integer), Fraction(
SparseMultivariatePolynomial(Integer,Kernel(
Expression(Integer)))), Fraction(Polynomial(Integer))
, Expression(Integer), Kernel(Expression(Integer))
Parameterized constructors traced:
SMP, INT, FRAC
fricas
)trace OutputForm
Packages traced:
SparseMultivariatePolynomial(Integer,Kernel(Expression(
Integer))), SparseMultivariatePolynomial(Integer,
Symbol), Integer, Fraction(Integer), Fraction(
SparseMultivariatePolynomial(Integer,Kernel(
Expression(Integer)))), Fraction(Polynomial(Integer))
, Expression(Integer), Kernel(Expression(Integer)),
OutputForm
Parameterized constructors traced:
SMP, INT, FRAC, OUTFORM
1::EXPR INT
1<enter Expression.coerce,61 :
arg1 = 1
1<enter Fraction.*,64 : 1\(#1=(0 . 1) . #1#)
1<enter SparseMultivariatePolynomial.coerce,98 :
arg1 = 1
2<enter SparseMultivariatePolynomial.coerce,98 :
arg1 = 1
2>exit SparseMultivariatePolynomial.coerce,98 :
1
1>exit SparseMultivariatePolynomial.coerce,98 :
1
1<enter SparseMultivariatePolynomial.=,32 :
arg1 = 1
arg2 = 1
2<enter SparseMultivariatePolynomial.=,32 :
arg1 = 1
arg2 = 1
1<enter Integer.=,58 : 1\1
1>exit Integer.=,58 : T
2>exit SparseMultivariatePolynomial.=,32 :
true
1>exit SparseMultivariatePolynomial.=,32 :
true
1<enter SparseMultivariatePolynomial.*,79 :
arg1 = 1
arg2 = 1
2<enter SparseMultivariatePolynomial.*,79 :
arg1 = 1
arg2 = 1
1<enter SparseMultivariatePolynomial.*,110 :
arg1 = 1
arg2 = 1
2<enter SparseMultivariatePolynomial.*,110 :
arg1 = 1
arg2 = 1
1<enter Integer.=,58 : 1\0
1>exit Integer.=,58 : NIL
1<enter Integer.=,58 : 1\1
1>exit Integer.=,58 : T
2>exit SparseMultivariatePolynomial.*,110 :
1
1>exit SparseMultivariatePolynomial.*,110 :
1
2>exit SparseMultivariatePolynomial.*,79 :
1
1>exit SparseMultivariatePolynomial.*,79 :
1
1<enter SparseMultivariatePolynomial.zero?,18 :
arg1 = 1
2<enter SparseMultivariatePolynomial.zero?,18 :
arg1 = 1
1<enter Integer.zero?,18 : 1
1>exit Integer.zero?,18 : NIL
2>exit SparseMultivariatePolynomial.zero?,18 :
false
1>exit SparseMultivariatePolynomial.zero?,18 :
false
1<enter SparseMultivariatePolynomial.=,32 :
arg1 = 1
arg2 = 1
2<enter SparseMultivariatePolynomial.=,32 :
arg1 = 1
arg2 = 1
1<enter Integer.=,58 : 1\1
1>exit Integer.=,58 : T
2>exit SparseMultivariatePolynomial.=,32 :
true
1>exit SparseMultivariatePolynomial.=,32 :
true
1>exit Fraction.*,64 : ((0 . 1) 0 . 1)
1>exit Expression.coerce,61 :
1
1<enter Expression.denom,101 :
arg1 = 1
1>exit Expression.denom,101 :
1
1<enter SparseMultivariatePolynomial.=,32 :
arg1 = 1
arg2 = 1
2<enter SparseMultivariatePolynomial.=,32 :
arg1 = 1
arg2 = 1
1<enter Integer.=,58 : 1\1
1>exit Integer.=,58 : T
2>exit SparseMultivariatePolynomial.=,32 :
true
1>exit SparseMultivariatePolynomial.=,32 :
true
1<enter Expression.numer,99 :
arg1 = 1
1>exit Expression.numer,99 :
1
1<enter SparseMultivariatePolynomial.retractIfCan,180 :
arg1 = 1
2<enter SparseMultivariatePolynomial.retractIfCan,180 :
arg1 = 1
2>exit SparseMultivariatePolynomial.retractIfCan,180 :
1
1>exit SparseMultivariatePolynomial.retractIfCan,180 :
1
1<enter Integer.coerce,32 : 1
1<enter OutputForm.outputForm,24 : 1
1>exit OutputForm.outputForm,24 : 1
1>exit Integer.coerce,32 : 1
Type: Expression(Integer)
fricas
2/3::FRAC INT
1<enter Fraction.coerce,10 : 3
1>exit Fraction.coerce,10 : (3 . 1)
1<enter Fraction.coerce,10 : 2
1>exit Fraction.coerce,10 : (2 . 1)
1<enter Fraction./,127 : (2 . 1)\(3 . 1)
1<enter Fraction.zero?,13 : (3 . 1)
1<enter Integer.zero?,18 : 3
1>exit Integer.zero?,18 : NIL
1>exit Fraction.zero?,13 : NIL
1<enter Fraction.recip,54 : (3 . 1)
1<enter Integer.zero?,18 : 3
1>exit Integer.zero?,18 : NIL
1<enter Integer.zero?,18 : 1
1>exit Integer.zero?,18 : NIL
1<enter Integer.=,58 : 3\1
1>exit Integer.=,58 : NIL
1<enter Integer.unitNormal,89 : 3
1>exit Integer.unitNormal,89 : #(1 3 1)
1<enter Integer.zero?,18 : 3
1>exit Integer.zero?,18 : NIL
1<enter Integer.*,66 : 1\1
1>exit Integer.*,66 : 1
1>exit Fraction.recip,54 : (0 1 . 3)
1<enter Fraction.*,61 : (2 . 1)\(1 . 3)
1<enter Fraction.zero?,13 : (2 . 1)
1<enter Integer.zero?,18 : 2
1>exit Integer.zero?,18 : NIL
1>exit Fraction.zero?,13 : NIL
1<enter Fraction.zero?,13 : (1 . 3)
1<enter Integer.zero?,18 : 1
1>exit Integer.zero?,18 : NIL
1>exit Fraction.zero?,13 : NIL
1<enter Fraction.=,21 : (2 . 1)\(1 . 1)
1<enter Integer.=,58 : 2\1
1>exit Integer.=,58 : NIL
1>exit Fraction.=,21 : NIL
1<enter Fraction.=,21 : (1 . 3)\(1 . 1)
1<enter Integer.=,58 : 1\1
1>exit Integer.=,58 : T
1<enter Integer.=,58 : 3\1
1>exit Integer.=,58 : NIL
1>exit Fraction.=,21 : NIL
1<enter Integer.=,58 : 3\1
1>exit Integer.=,58 : NIL
1<enter Integer.gcd,87 : 2\3
1>exit Integer.gcd,87 : 1
1<enter Integer.one?,19 : 1
1>exit Integer.one?,19 : T
1<enter Integer.=,58 : 1\1
1>exit Integer.=,58 : T
1<enter Integer.*,66 : 2\1
1>exit Integer.*,66 : 2
1<enter Integer.*,66 : 3\1
1>exit Integer.*,66 : 3
1<enter Integer.zero?,18 : 2
1>exit Integer.zero?,18 : NIL
1<enter Integer.=,58 : 3\1
1>exit Integer.=,58 : NIL
1<enter Integer.unitNormal,89 : 3
1>exit Integer.unitNormal,89 : #(1 3 1)
1<enter Integer.zero?,18 : 3
1>exit Integer.zero?,18 : NIL
1<enter Integer.*,66 : 2\1
1>exit Integer.*,66 : 2
1>exit Fraction.*,61 : (2 . 3)
1>exit Fraction./,127 : (2 . 3)
1<enter Integer.=,58 : 3\1
1>exit Integer.=,58 : NIL
1<enter Integer.coerce,32 : 2
1<enter OutputForm.outputForm,24 : 2
1>exit OutputForm.outputForm,24 : 2
1>exit Integer.coerce,32 : 2
1<enter Integer.coerce,32 : 3
1<enter OutputForm.outputForm,24 : 3
1>exit OutputForm.outputForm,24 : 3
1>exit Integer.coerce,32 : 3
1<enter OutputForm./,100 : 2\3
1>exit OutputForm./,100 : (/ 2 3)
1<enter Integer.=,58 : 2\2
1>exit Integer.=,58 : T
1<enter OutputForm.outputForm,26 : OVER
1>exit OutputForm.outputForm,26 : OVER
Type: Fraction(Integer)
For a preliminary analysis, see SandBox Trace Analysed.