PreviousUpNext

15.4.936  src/lib/src/object.pkg

## object.pkg

# Compiled by:
#     src/lib/std/standard.lib

# Object / object are adapted from
# Bernard Berthomieu's "OOP Programming Styles in ML"
# Appendix 2.3.2 where they are called EQOBJ/Eqobj:
#
package object: Object {                                # Object        is from   src/lib/src/object.api

    exception EQUAL;

    class super = root_object;

    Object__State(X) =  OBJECT__STATE Object__Methods(X)
    withtype    
        Full__State(X) = (Object__State(X), X)                  # Our state record plus those of our subclass chain, if any.
    also
        Self(X) = super::Self( Full__State(X) )
    also
        Object__Methods(X) = Self(X) -> Self(X) -> Bool         # Our sole method compares objects for equality.
    ;    

    Myself = Self( oop::Oop_Null );

    fun equal p q
        =
        {   my (_, (OBJECT__STATE eq, _)) =  super::unpack__object p;
            eq p q;
        };

    fun get__substate me
        =
        {   my (state, substate) =   super::get__substate me;
            substate;
        };
    
    fun unpack__object me
        =
        oop::unpack_object  (super::unpack__object me); 
    
    fun override__equal  new_method  me
        =
        oop::repack_object
            (fn (OBJECT__STATE old_method) = OBJECT__STATE (new_method old_method))
            (super::unpack__object me);
        
    fun repack_methods  update_methods  me
        =
        oop::repack_object
            (fn (OBJECT__STATE object__methods) = OBJECT__STATE (update_methods  object__methods))
            (super::unpack__object me);

    # Here we define a default object-equality
    # comparison function to be overridden by subclasses.
    #
    # Since we don't know any state variables at this point
    # we cannot do any interesting equality comparison,
    # so we just raise the EQUAL exception if we actually
    # get called:
    #
    fun default_equal
            (p: Self(X))
            (q: Self(X))
            : Bool
        =
        raise exception EQUAL;  

    fun pack__object () substate
        =
        super::pack__object () (OBJECT__STATE default_equal, substate);

    fun make__object ()
        =
        pack__object () oop::OOP_NULL;
};


Comments and suggestions to: bugs@mythryl.org

PreviousUpNext