Changeset 1795


Ignore:
Timestamp:
Nov 26, 2005, 12:39:58 AM (15 years ago)
Author:
orlov
Message:
  • Box shouldn't extend Expr because of different equals() semantics.
  • All returned exprs from refal-funcion should be assigned with Expr.assign().
  • Any refal-function can throw RefalException?.
  • Named boxes are presented by NamedBox?.
  • All named objects should implement the Named interface.
Location:
to-imperative/trunk/java/org/refal/plus
Files:
3 added
2 deleted
2 edited

Legend:

Unmodified
Added
Removed
  • to-imperative/trunk/java/org/refal/plus/Box.java

    r1793 r1795  
    55package org.refal.plus;
    66
    7 public class Box extends Expr
     7public class Box
    88{
     9    private Expr expr;
    910
    10     /**
    11      * @param e
    12      *
    13      */
     11    public Box ()
     12    {
     13        expr = new Expr();
     14    }
     15
    1416    public Box (Expr e)
    1517    {
    16         super(e);
     18        expr = e;
     19    }
     20
     21    public Box (Object o)
     22    {
     23        expr = new Expr(o);
     24    }
     25
     26    public Box (Object[] arr)
     27    {
     28        expr = new Expr(arr);
    1729    }
    1830
     
    2133     * @param _res
    2234     */
    23     static public void _i_Box (Expr e, Expr res)
     35    static public void Box (Expr e, Expr res)
    2436    {
    2537        res = new Expr(new Box(e));
     
    3143     * @return
    3244     */
    33     static public void _q_ (Expr box, Expr res)
     45    static public void _q_ (Expr box, Expr res) throws RefalException
    3446    {
    3547        // FIXME: insert here assertion box.length == 1
    3648        if (!(box.at(0) instanceof Box))
    37             throw new LibError("Invalid argument");
    38         res = (Expr) box.at(0);
     49            throw new RefalException("Box", "?", "Invalid argument");
     50        res.assign(((Box) box.at(0)).expr);
    3951    }
    4052
     
    4456     * @return
    4557     */
    46     static public void Store (Expr box, Expr e)
     58    static public void Store (Expr box, Expr e) throws RefalException
    4759    {
    4860        // FIXME: insert here assertion box.length == 1
    4961        if (!(box.at(0) instanceof Box))
    50             throw new LibError("Invalid argument");
    51         Expr b = (Expr) box.at(0);
    52         b = e;
     62            throw new RefalException("Box", "Store", "Invalid argument");
     63        ((Box) box.at(0)).expr = e;
    5364    }
    5465
  • to-imperative/trunk/java/org/refal/plus/Expr.java

    r1792 r1795  
    8585    }
    8686
     87    public void assign(Expr e) {
     88        expr = e.expr;
     89        index = e.index;
     90        length = e.length;
     91    }
     92
    8793    /**
    8894     * Element at position `i`
     
    165171            throw new ClassCastException();
    166172        Expr e = (Expr) o;
     173//        if (equals(e))        // Check how this affects efficiency!
     174//            return 0;
    167175        int compare_len = -1;                                                                       
    168176        int min_len = length;
     
    179187        {
    180188            int res;
    181             if (expr[i].getClass() == e.expr[j].getClass())
     189            Class c1 = expr[i].getClass();
     190            Class c2 = e.expr[j].getClass();
     191            if (c1 == c2)
    182192                res = ((Comparable) expr[i]).compareTo(e.expr[j]);
    183193            else
    184194            {
    185                 // FIXME: This is a stub!  Should order types somehow...
    186                 res = 0;
     195                if (c1 == Expr.class)
     196                    res = 1;
     197                else if (c2 == Expr.class)
     198                    res = -1;
     199                else {
     200                    // FIXME: This is a stub!  Should order types somehow...
     201                    res = 0;
     202                }
    187203            }
    188204            if (res != 0) return res;
Note: See TracChangeset for help on using the changeset viewer.