A hack using packages is given below. This currently works for T in {Integer, 
Symbol}, List(T), Product(S,T) and Product(List(S),List(T)). Extension should 
not be too painful...

Kindly, Mark.

-- base types
)abbrev package SHOW Show
Show() : Export == Implementation  where
   Export == with
      show: Integer -> String
      show: Symbol -> String
      -- etc
   Implementation == add
      show (n:Integer) == string n
      show (n:Symbol) == string n
      -- etc

-- single type (e.g. homogeneous aggregates)
)abbrev package SHOW1 Show1
Show1(T:SetCategory) : Export == Implementation where
   Export == with
      if Show has (show:T->String) then
         show: List(T) -> String
   Implementation == add
      if Show has (show:T->String) then
         show(xs : List(T)) : String ==                  -- print xs  to string
            empty? xs => "[]"
            x   := first xs
            xs  := rest  xs
            str := concat("[", show x)
            while  not empty?(xs)  repeat
               x   := first xs
               xs  := rest  xs
               str := concat[str, ",", show x]
            concat(str, "]")

-- two types
)abbrev package SHOW2 Show2
Show2(S:SetCategory, T:SetCategory) : Export == Implementation where
   Export == with
      if Show has (show:S->String) and Show has (show:T->String) then
         show: Product(S,T) -> String
   Implementation == add
      if Show has (show:S->String) and Show has (show:T->String) then
         show(p : Product(S,T)) : String ==
            concat[ "(", show (selectfirst p), ",", show (selectsecond p), ")" ]

-- composition
)abbrev package SHOWN Shown
Shown(S:SetCategory, T:SetCategory) : Export == Implementation where
   Export == with
      if Show1(S) has (show:List(S)->String) and Show1(T) has 
(show:List(T)->String) then
         show: Product(List(S),List(T)) -> String
      -- etc
   Implementation == add
      if Show1(S) has (show:List(S)->String) and Show1(T) has 
(show:List(T)->String) then
         show(p : Product(List(S),List(T))) : String ==
            concat[ "(", show (selectfirst p), ",", show (selectsecond p), ")" ]

)if false
show 'a
show [1,2,3]
show makeprod(1,'a)$Product(Integer,Symbol)
show makeprod([1,2],[a,b])$Product(List(Integer),List(Symbol))
)end if

-- 
You received this message because you are subscribed to the Google Groups 
"FriCAS - computer algebra system" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/fricas-devel?hl=en.

Reply via email to