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
Line 
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)
22    app a b = Q $ unQ a (unQ b)
23
24eval :: Q a -> a
25eval = unQ
26
27{-
28 - show interpreter
29 -}
30showVar :: Int -> String -> String
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
35-- unS :: Value supply -> Precedence -> ShowS
36newtype S a = S { unS :: S.Supply Int -> Int -> ShowS }
37
38instance Lambda S where
39    const a = S (\_ p -> showsPrec p a)
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
49ast :: S a -> IO ShowS
50ast a = do
51    s <- S.newSupply 0 (+1)
52    return $ unS a s 0
53
54printAst :: S a -> IO ()
55printAst l = ast l >>= (\s -> putStrLn $ s "")
Note: See TracBrowser for help on using the repository browser.