(1) -> P := SparseUnivariatePolynomial(Integer)
(1) SparseUnivariatePolynomial(Integer)
Type: Type
(2) -> p: P := x^5+4*x^4+2*x^3+3*x^2+3*x^1+5
5 4 3 2
(2) ? + 4? + 2? + 3? + 3? + 5
Type: SparseUnivariatePolynomial(Integer)
(3) -> v := vectorise(p, 7)
(3) [5,3,3,2,4,1,0]
Type: Vector(Integer)
(4) -> l := [v.i for i in 1..#v]
(4) [5,3,3,2,4,1,0]
Type: List(Integer)
(5) -> lp := [monomial(c,i)$P for c in l for i in 0..#l]
2 3 4 5
(5) [5,3?,3? ,2? ,4? ,? ,0]
Type: List(SparseUnivariatePolynomial(Integer))
(7) -> q := reduce(+,lp,0)
5 4 3 2
(7) ? + 4? + 2? + 3? + 3? + 5
Type: SparseUnivariatePolynomial(Integer)
(8) -> p-q
(8) 0
The problem starts when you try to use
q := reduce(+,lp,0)
in a .spad file and compile it. The compiler will return something like:
Compiling FriCAS source code from file
/path/to/file.spad using old system
compiler.
PKGABBREV abbreviates package PackageName
******** Boot Syntax Error detected ********
The prior line was:
47> lp:List(P):=[monomial(c,i)$P for c in l for i in 0..#l];
The current line is:
48> q:=reduce(+,lp,0); ^
First currently preparsed lines are:
...
The number of valid tokens is 2.
The prior token was #S(TOKEN :SYMBOL |(| :TYPE KEYWORD :NONBLANK T)
The current token is #S(TOKEN :SYMBOL + :TYPE KEYWORD :NONBLANK T)
The next token is #S(TOKEN :SYMBOL |,| :TYPE KEYWORD :NONBLANK T)
The only thing I could decode from that was that there is probably something wrong with the “+” sign parameter in the reduce function.
… and indeed. As the reply from Dr. Hemmecke (RISC) says:
The problem is that + is used as the name of a function, but it is not actually an identifier. It must be treated in a special way otherwise the parser thinks that + is used without the left and right argument.
Actually, I hope some day that usage of + will work, but currently you have to help the compiler by writing
vq:=reduce(_+,lp,0)i.e., escaping the + by an underscore. This turns + into an identifier and thus everything will work as expected.
Of course, that escaping also applies in other places and for all the other operators like +,*,-,^, …