home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Datafile PD-CD 2
/
DATAFILE_PDCD2.iso
/
utilities
/
_gofer
/
!Gofer
/
archives
/
Demos
/
Lamvar
/
lambdaVr
< prev
next >
Wrap
Text File
|
1993-02-12
|
3KB
|
69 lines
-----------------------------------------------------------------------------
-- 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 -----------------------------------------------------------