Changeset 15418

Show
Ignore:
Timestamp:
03/03/07 14:54:49 (21 months ago)
Author:
audreyt
Message:

* Pugs.Class: Stub implementation of WHAT; also make mkObj a

Boxable class method so we can make class-less objects,
or objects whose .HOW is not backed by instances of the
Perl6 Class.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/Class.hs

    r15407 r15418  
    3030 
    3131class (Show a, Typeable a, Ord a, Typeable1 m, Monad m) => Boxable m a | a -> m where 
     32    mkObj :: a -> Invocant m 
     33    mkObj x = MkInvocant x (class_interface (classOf x)) 
     34 
    3235    classOf :: a -> MI m 
    3336    classOf o = mkBoxClass ty ([] :: [(ID, ID -> m (Invocant m))]) 
     
    4346    fromObj (MkInvocant x _) = fromTypeable x 
    4447 
    45 (...) :: forall a b (m :: * -> *). (Boxable m b) => String -> (a -> b) -> (ID, a -> m (Invocant m)) 
    46 (...) x y = (_cast x, mkObj . y) 
     48(...) :: Boxable m b => String -> (a -> b) -> (ID, a -> m (Invocant m)) 
     49(...) x y = (_cast x, (return . mkObj) . y) 
    4750 
    48 (!!!) :: forall a1 (m :: * -> *) a. (Boxable m a) => String -> (a1 -> m a) -> (ID, a1 -> m (Invocant m)) 
     51(!!!) :: Boxable m b => String -> (a -> m b) -> (ID, a -> m (Invocant m)) 
    4952(!!!) x y = (_cast x, mkObjM . y) 
    5053 
    51 mkObj :: (Boxable m a) => a -> m (Invocant m) 
    52 mkObj x = return $ MkInvocant x (class_interface (classOf x)) 
    53  
    54 mkObjM :: (Boxable m a) => m a -> m (Invocant m) 
     54mkObjM :: Boxable m a => m a -> m (Invocant m) 
    5555mkObjM x = do 
    5656    x' <- x 
     
    8484    mkBoxClass cls methods' 
    8585    where 
    86         methods' = methods ++ 
    87             [ "HOW"         ... (const self) 
    88             , "WHICH"       ... id 
    89             ] 
     86    methods' = methods ++ 
     87        [ "HOW"         ... const self 
     88        , "WHAT"        ... const (raiseWhatError ("Can't access attributes of prototype: " ++ cls) `asTypeOf` self) 
     89        , "WHICH"       ... id 
     90        ] 
     91 
     92raiseWhatError :: String -> a 
     93raiseWhatError = error 
    9094 
    9195mkBoxMethod :: forall t (m1 :: * -> *) (m :: * -> *). 
     
    96100    , Monad m1 
    97101    ) => (ID, t -> m1 (Invocant m1)) -> AnyMethod m 
    98 mkBoxMethod (meth, fun) = AnyMethod $ MkSimpleMethod 
     102mkBoxMethod (meth, fun) = MkMethod $ MkSimpleMethod 
    99103    { smName = meth 
    100104    , smDefinition = MkMethodCompiled $ HsCode $ \args -> do