home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Datafile PD-CD 2
/
DATAFILE_PDCD2.iso
/
utilities
/
_gofer
/
!Gofer
/
archives
/
Demos
/
Lamvar
/
lambdaNu
next >
Wrap
Text File
|
1993-02-12
|
3KB
|
77 lines
-----------------------------------------------------------------------------
-- Lambda Nu: January 25, 1993
--
-- The definitions in this file provide support for a simple implementation
-- of Lambda Nu -- a generalisation of Lambda Var as described by Odersky,
-- Rabin and Hudak in their POPL paper, January 1993.
--
-- Of course, the implementation of the fuction `begin' is not sound. You must
-- ensure that you use this function correctly -- the responsibility is on you,
-- the programmer.
--
-- 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 3 =:
infixr 2 >>, >>=, ?
-- Lambda nu hacking: -------------------------------------------------------
primitive return "primLnReturn" :: a -> Cmd b a
primitive (>>=) "primLnBind" :: Cmd a b -> (b -> Cmd a c) -> Cmd a c
primitive primLnTagEq "primLnTagEq" :: Tag a -> Tag a -> Bool
primitive newvar "primLnNew" :: Cmd a (Tag b)
primitive assign "primLnAssign" :: Tag a -> a -> Cmd b ()
primitive (?) "primLnRead" :: Tag a -> (a -> Cmd b c) -> Cmd b c
primitive io "primLnIo" :: ((a -> b) -> b) -> Cmd b a
primitive begin "primLnBegin" :: Cmd a b -> a
instance Eq (Tag a) where
(==) = primLnTagEq
(>>) :: Cmd c a -> Cmd c b -> Cmd c b
f >> g = f >>= const g
seq :: [Cmd m a] -> Cmd m ()
seq = foldr (>>) (return ())
new :: (Tag a -> Cmd b c) -> Cmd b c
new = (>>=) newvar
(=:) :: a -> Tag a -> Cmd b ()
value =: tag = assign tag value
out :: (a -> a) -> Cmd a ()
out a = io (\c -> a (c ()))
outConst = out . const
pure :: Cmd a a -> a
pure a = begin (a >>= outConst)
deref :: Tag a -> Cmd b a
deref t = t ? return
-- Very simple monadic I/O in the Glasgow style: -----------------------------
primitive getch "primLnGetch" :: Cmd a Char
primitive putchar "primLnPutchar" :: Char -> Cmd a ()
primitive system "primLnSystem" :: String -> Cmd a Int
getchar :: Cmd a Char
getchar = getch >>= \c ->
putchar c >>
return c
puts :: String -> Cmd a ()
puts = seq . map putchar
-- an abuse of pure to implement hbc's debugging hack:
trace s a = pure (puts s >> return a)
-- End of lambdaNu -----------------------------------------------------------