Martin Rubey <[EMAIL PROTECTED]> writes:

> Dear Gaby, Waldek,
> 
> I tried today to port from open-axiom the feature that allows an ordinary
> function to return a type, but failed.  I.e.:
> 
> -------------------------------------------------------------------------------
> )abbrev package EXPORT ExportType
> ExportType(x: Ring): with
>     baseRing: () -> Ring
>   == add
>     baseRing() == x
> -------------------------------------------------------------------------------
> 
> I := baseRing()$EXPORT INT
> 1$I
> 
> should give [EMAIL PROTECTED]
> 
> Curiously, *that* feature works with the patch below, but there are lots of
> regressions.  It seems that "Complex INT" does not work anymore:
> 
> (3) -> m: Complex INT := 1       
> 
>    >> System error:
>    Caught fatal error [memory may be damaged]

I just realised that this error occurs already in a patch I applied previously
(locally), namely when I upcase all the attributes...  It seems that the
attribute removal still needs some work.

I'd be very grateful if somebody else could test the patch below (and before
test whether m: Complex INT := 1 works) with the current revision of FriCAS.

Many thanks,

Martin
 


> 
> Gaby, does that ring a bell? Help would be greatly appreciated!
> 
> Martin
> 
> Index: i-analy.boot
> ===================================================================
> --- i-analy.boot      (Revision 364)
> +++ i-analy.boot      (Arbeitskopie)
> @@ -208,6 +208,11 @@
>  -- Also see I-SPEC BOOT for special handlers and I-MAP BOOT for
>  -- user function processing.
>  
> +isCategoryForm(x,e) ==
> +  x is [name,:.] => categoryForm? name
> +  atom x => u:= get(x,"macro",e) => isCategoryForm(u,e)
> +
> +
>  bottomUp t ==
>    -- bottomUp takes an attributed tree, and returns the modeSet for it.
>    -- As a side-effect it also evaluates the tree.
> @@ -258,6 +263,11 @@
>              argModeSetList:= [bottomUp x for x in argl]
>  
>      ms := bottomUpForm(t,op,opName,argl,argModeSetList)
> +    -- If this is a type producing form, then we don't want
> +    -- to store the representation object in the environment.
> +    -- Rather, we want to record the reified canonical form.
> +    if ms is [m] and (m in '((Mode) (Domain) (SubDomain (Domain))) or 
> isCategoryForm(m,$e))
> +    then putValue(t,objNew(devaluate objValUnwrap getValue t, m))
>  
>      -- given no target or package calling, force integer constants to
>      -- belong to tightest possible subdomain
> Index: i-eval.boot
> ===================================================================
> --- i-eval.boot       (Revision 364)
> +++ i-eval.boot       (Arbeitskopie)
> @@ -145,10 +145,22 @@
>      op='Record =>
>        [op,:[['_:,sel,evaluateType type] for ['_:,sel,type] in argl]]
>      op='Enumeration => form
> -    evaluateType1 form
> +    evaluateFormAsType form
>    constructor? form =>
>      ATOM form => evaluateType [form]
>      throwEvalTypeMsg("S2IE0003",[form,form])
> +  evaluateFormAsType form
> +
> +++ `form' used in a context where a type (domain or category) is
> +++ expected.  Attempt to fully evaluate it.  Error if the resulting
> +++ value is not a type.  When successful, the result is the reified
> +++ canonical form of the type.
> +evaluateFormAsType form ==
> +  form is [op,:args] and constructor? op => evaluateType1 form
> +  t := mkAtree form
> +  -- ??? Maybe we should be more careful about generalized types.
> +  bottomUp t is [m] and (m in '((Mode) (Domain) (SubDomain (Domain))) or 
> isCategoryForm(m,$e)) =>
> +    objVal getValue t
>    throwEvalTypeMsg("S2IE0004",[form])
>  
>  evaluateType1 form ==
> Index: i-spec1.boot
> ===================================================================
> --- i-spec1.boot      (Revision 364)
> +++ i-spec1.boot      (Arbeitskopie)
> @@ -1216,7 +1216,8 @@
>      get(form,'value,$InteractiveFrame) or _
>      (PAIRP($env) and get(form,'value,$env)) or _
>      (PAIRP($e) and get(form,'value,$e)))) and
> -      objMode(val) in '((Domain) (SubDomain (Domain))) =>
> +      ((m := objMode(val)) in '((Domain) (SubDomain (Domain)))
> +          or categoryForm? m) =>
>          objValUnwrap(val)
>    nil
>  
> 
> 
> -------------------------------------------------------------------------
> This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
> Build the coolest Linux based applications with Moblin SDK & win great prizes
> Grand prize is a trip for two to an Open Source event anywhere in the world
> http://moblin-contest.org/redirect.php?banner_id=100&url=/
> _______________________________________________
> open-axiom-devel mailing list
> open-axiom-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/open-axiom-devel


-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
open-axiom-devel mailing list
open-axiom-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open-axiom-devel

Reply via email to