source: sizechecking/branches/macs/Lambda.hs @ 23

Last change on this file since 23 was 23, checked in by gobi, 11 years ago

expression

File size: 1.4 KB
RevLine 
[19]1{-# LANGUAGE FlexibleContexts,FlexibleInstances #-}
2module Lambda where
3
4import qualified Data.Supply as S
5import qualified Data.Char as C
6
7{-
8 - Lambda calculus beagyazas
9 -}
10class Lambda l where
11    lam   :: (l a -> l b) -> l (a -> b)
12    app   :: l (a -> b) -> l a -> l b
13    const :: Int -> l Int
14
15{-
16 - eval interpreter
17 -}
18newtype Q a = Q { unQ :: a }
19instance Lambda Q where
20    const = Q
21    lam a = Q (unQ.a.Q)
[20]22    app a b = Q $ unQ a (unQ b)
[19]23
[20]24eval :: Q a -> a
[19]25eval = unQ
26
27{-
28 - show interpreter
29 -}
[20]30showVar :: Int -> String -> String
[19]31showVar x = if x>28 
32    then showVar (x `div` 29) . showChar (C.chr $ C.ord 'a' + (x `mod` 29))
33    else showChar $ C.chr $ C.ord 'a' + x
34
[20]35-- unS :: Value supply -> Precedence -> ShowS
[19]36newtype S a = S { unS :: S.Supply Int -> Int -> ShowS }
[20]37
[19]38instance Lambda S where
[20]39    const a = S (\_ p -> showsPrec p a)
[19]40    app (S fun) (S arg) = S (\s p -> 
41        let (s1, s2) = S.split2 s
42        in showParen (p>6) $ fun s1 6 . showChar ' ' . arg s2 7)
43    lam fun = S (\s p -> 
44        let (s1, s2) = S.split2 s
45            v        = S.supplyValue s1
46            showV = S $ \_ _ -> showVar v
47        in showParen (p>0) $ showChar 'λ' . showVar v . showChar '.' . unS (fun showV) s2 0)
48
[20]49ast :: S a -> IO ShowS
[19]50ast a = do
51    s <- S.newSupply 0 (+1)
52    return $ unS a s 0
53
[20]54printAst :: S a -> IO ()
55printAst l = ast l >>= (\s -> putStrLn $ s "")
Note: See TracBrowser for help on using the repository browser.