Changeset 20 for sizechecking/branches/macs/Lambda.hs
- Timestamp:
- May 2, 2014, 1:59:29 PM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
sizechecking/branches/macs/Lambda.hs
r19 r20 21 21 const = Q 22 22 lam a = Q (unQ.a.Q) 23 app a b = Q $ (unQ a)(unQ b)23 app a b = Q $ unQ a (unQ b) 24 24 25 eval :: Q a -> a 25 26 eval = unQ 26 27 instance Num a => Num (Q a) where28 (Q a) + (Q b) = Q (a+b)29 (Q a) - (Q b) = Q (a-b)30 (Q a) * (Q b) = Q (a*b)31 abs (Q a) = Q (abs a)32 33 27 34 28 {- 35 29 - show interpreter 36 30 -} 31 showVar :: Int -> String -> String 37 32 showVar x = if x>28 38 33 then showVar (x `div` 29) . showChar (C.chr $ C.ord 'a' + (x `mod` 29)) 39 34 else showChar $ C.chr $ C.ord 'a' + x 40 35 36 -- unS :: Value supply -> Precedence -> ShowS 41 37 newtype S a = S { unS :: S.Supply Int -> Int -> ShowS } 38 42 39 instance Lambda S where 43 const a = S (\ s p -> flip showsPrec a p)40 const a = S (\_ p -> showsPrec p a) 44 41 app (S fun) (S arg) = S (\s p -> 45 42 let (s1, s2) = S.split2 s … … 51 48 in showParen (p>0) $ showChar 'λ' . showVar v . showChar '.' . unS (fun showV) s2 0) 52 49 50 ast :: S a -> IO ShowS 53 51 ast a = do 54 52 s <- S.newSupply 0 (+1) 55 53 return $ unS a s 0 56 54 57 printAst a = ast a >>= (\a -> putStrLn $ a "")58 55 printAst :: S a -> IO () 56 printAst l = ast l >>= (\s -> putStrLn $ s "")
Note: See TracChangeset
for help on using the changeset viewer.