home *** CD-ROM | disk | FTP | other *** search
- -----------------------------------------------------------------------------
- -- Lambda Var: November 3, 1992
- --
- -- The definitions in this file provide support for a simple implementation
- -- of Lambda Var -- as described by Odersky, Rabin and Hudak in their POPL
- -- paper, January 1993. Note however, that the implementation of the
- -- fuction `pure' is not sound. You must ensure that you use this function
- -- correctly -- the responsibility is on you, the programmer.
- --
- -- This file must be loaded with the constructor classes prelude, which is
- -- usually called `cc.prelude'.
- --
- -- Incidentally, the definitions in this file can only be used if the
- -- version of Gofer that you are using has been compiled with the correct
- -- set of primitives included. In addition, there is no support for these
- -- primitives in gofc, the Gofer compiler.
- --
- -- Operator precedence table: -----------------------------------------------
-
- infixr 1 =:
- infixr 0 $$, $=, ?
-
- -- Lambda var hacking: ------------------------------------------------------
-
- primitive pure "primLvPure" :: Proc a -> a
- primitive (?) "primLvRead" :: Var a -> (a -> Proc b) -> Proc b
- primitive primLvReturn "primLvReturn" :: a -> Proc a
- primitive primLvBind "primLvBind" :: Proc a -> (a -> Proc b) -> Proc b
- primitive (=:) "primLvAssign" :: a -> Var a -> Proc b
- primitive var "primLvVar" :: (Var a -> Proc b) -> Proc b
- primitive newvar "primLvNewvar" :: Proc (Var a)
- primitive primLvVarEq "primLvVarEq" :: Var a -> Var a -> Bool
-
- type Prog = Proc ()
-
- ($=) :: Monad m => m a -> (a -> m b) -> m b
- ($=) = bind
-
- ($$) :: Monad m => m a -> m b -> m b
- f $$ g = f $= const g
-
- seq :: Monad m => [m a] -> m ()
- seq = foldr ($$) (result ())
-
- instance Eq (Var a) where (==) = primLvVarEq
-
- instance Functor Proc where map f x = [ f y | y <- x ]
-
- instance Monad Proc where result = primLvReturn
- bind = primLvBind
-
- -- Very simple monadic I/O in the Glasgow style: -----------------------------
-
- primitive getch "primLvGetch" :: Proc Char
- primitive putchar "primLvPutchar" :: Char -> Proc ()
-
- getchar :: Proc Char
- getchar = getch $= \c ->
- putchar c $$
- result c
-
- puts :: String -> Proc ()
- puts = seq . map putchar
-
- -- an abuse of pure to implement hbc's debugging hack:
- trace s a = pure (puts s $$ result a)
-
- -- End of lambdaVr -----------------------------------------------------------
-