Hello,

I am pretty sure I am wrong but why not something like:

)abbrev domain RHSUP RHSparseUnivariatePolynomial
RHSparseUnivariatePolynomial(R) : Exports == Implementation where
  R : Ring
  Exports ==> UnivariatePolynomialCategory(R) with
    foo : () -> String
  Implementation ==> SparseUnivariatePolynomial(R) add
    foo() == "foo"
    coerce(p : %) : OutputForm  ==
      h := p pretend SparseUnivariatePolynomial(R)
      outputForm(h, "t"::Symbol::OutputForm)

)abbrev domain RH2SUP RH2SparseUnivariatePolynomial
RH2SparseUnivariatePolynomial(R) : Exports == Implementation where
  R : Ring
  Exports ==> UnivariatePolynomialCategory(R) with
    foo : () -> String
    bar : () -> String
  Implementation ==> SparseUnivariatePolynomial(R) add
    foo() == "foo"
    bar() == "bar"
    coerce(p : %) : OutputForm  ==
      h := p pretend SparseUnivariatePolynomial(R)
      outputForm(h, "t"::Symbol::OutputForm)

)abbrev package RHX RHx
RHx(R: Ring, POL : UnivariatePolynomialCategory(R)): with
    var: () -> OutputForm
    if POL has foo : () -> String then
      foo : () -> String
    if POL has bar : () -> String then
      bar : () -> String
      bar2 : () -> String
  == add
    mon ==> monomial$POL
    if POL has foo : () -> String then
      foo() == foo()$POL
    if POL has bar : () -> String then
      bar() == bar()$POL
      bar2() == bar()$POL
    var(): OutputForm == mon(1$R,1$NonNegativeInteger) :: OutputForm

?

- Greg
PS: I will respond to your question later in another thread about SUP,
SingletonAsOrderedSet etc when I can, sorry.

Le jeu. 3 juil. 2025 à 17:44, Waldek Hebisch <de...@fricas.org> a écrit :
>
> On Thu, Jul 03, 2025 at 07:46:22AM +0200, 'Ralf Hemmecke' via FriCAS - 
> computer algebra system wrote:
> > On 7/3/25 03:15, Waldek Hebisch wrote:
> > > You are exploring land of bugs.
> >
> > As usual. ;-)
> >
> > I don't even know whether such a construction is specified to work even in
> > Aldor.
>
> I would say that from general point of view code looks OK.
> It is just question what in implemented in the respective compiler.
>
> >   The following compiles
> > >
> > > )abbrev package RHX RHx
> > > RHx(R: Ring, POL: R -> UnivariatePolynomialCategory R): with
> > >      var: () -> OutputForm
> > >    == add
> > >      fT := POL(R)
> > >      mon ==> monomial$fT
> > >      var(): OutputForm == mon(1$R, 1$NonNegativeInteger)::OutputForm
> > >
> > > but generated code is wrong.
> > >
> > > In general, your code here is quite different than current algebra
> > > code.  That is normally caller would evaluate POL(R) nad RHx would
> > > use its value.
> >
> > Hmmm... but that seems to tell my that I would have to make a part of the
> > respective (RHx) package explicit to the caller.
> >
> > Actually, I oversimplified. What I really want inside RHx is calling
> > functions from POL(Matrix R), i.e., I should have given
> >
> >   RHx(R: Ring, POL: (X:Ring) -> UnivariatePolynomialCategory X): with
> >
> > as the initial line of definition. In my current setup the respective POL
> > constructor would even have a second parameter that depends on X.
> > I wanted to hide the (respective) "Matrix" constructur from the caller as
> > implementation detail.
>
> You need to specify them somewhere.  Old Spad way it to pass all
> such thing down trough intermediate constructors.  Some things
> may be hidden by using categores: category specifies what needs
> to be visible to users of a package, package may have more arguments
> or more specific arguments.  You may look at amodgcd.spad.
> ModularAlgebraicGcdOperations specifies things in terms of abstrat
> types and users of packages of this category only see abstrat
> things, but unneeded specifics are hidden.  Only package gets
> full details.
>
> Also, there is question of efficiency.  Your 'var' is probably
> rather uncritical, but in amodgcd.spad I wanted as efficient code
> as possible.  Giving specific types to packages (and in fact
> "hardcoding" some details inside packages) lead to efficient
> code inside.  With code as you wrote there is ususaly expensive
> call to package/domain that is specified only at runtime.  My
> modification above which compiles moved place where POL(R) is
> fully specified to place that is run only once (that is at
> package instationation time).  Theoretically Spad compiler could
> automatically do such transformantions, but I do not think
> that this is done now.
>
> There is related issue.  To get better efficiency Spad compiler
> normally caches types, that is types is instantiated once and
> reused after that.  But if type depends on runtime values, then
> it must be dully recomputed.  Spad functions may produce different
> value on each call, even if arguments are the same, so your
> use disallows caching.  My modification explicitely caches type
> value.
>
> One extra remark: I do not know how to implement such calls
> efficiently.  This means that usually I would prefer different
> construct.  This limits my motivation to implement them
> (which currently seem to require substantial work).
>
> --
>                               Waldek Hebisch
>
> --
> You received this message because you are subscribed to the Google Groups 
> "FriCAS - computer algebra system" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to fricas-devel+unsubscr...@googlegroups.com.
> To view this discussion visit 
> https://groups.google.com/d/msgid/fricas-devel/aGalT4ix9bI3JAKm%40fricas.org.

-- 
You received this message because you are subscribed to the Google Groups 
"FriCAS - computer algebra system" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to fricas-devel+unsubscr...@googlegroups.com.
To view this discussion visit 
https://groups.google.com/d/msgid/fricas-devel/CAHnU2dYUtNr9_BD21wX6SdmH4E6UPbyD-XWBbnyX6L8Pf7FCOA%40mail.gmail.com.

Reply via email to