1module Initialize (initialize) where
4import Control.Arrow (first)
6import Data.Char (isAlpha)
7import Data.Maybe (mapMaybe)
8import Data.Either (rights)
11import Parser (toExpr,toDefs)
19 (expr, hints') <- toDefs =<< tokenize str
20 let expr' = rename expr
21 subs <- unify (liftM2 (++) hints hints') expr'
22 return (seq subs expr')
26 expr <- toDefs =<< tokenize str
27-- let rexpr = rename expr
28-- let init = simp_loop rexpr
29-- return $ if depth init < depth rexpr then init else rexpr
33simp_loop exp = if exp == exp' then exp' else simp_loop exp'
39 Range e1 e2 -> simp_range (f e1) (f e2)
40 Binop op e1 e2 -> simp_binop op (f e1) (f e2)
41 Lambda x e -> Lambda x (f e)
42 App e1 e2 -> simp_app (f e1) (f e2)
43 If e1 e2 e3 -> simp_if (f e1) (f e2) (f e3)
44 Lift e es -> Lift (f e) $ map f es
45 Fold e1 e2 e3 -> Fold (f e1) (f e2) (f e3)
46 Async e -> Async (f e)
47 Let x e1 e2 -> simp_let x (f e1) (f e2)
48 Data name es -> Data name (map f es)
49 Case e cases -> simp_case (f e) cases
52data Status = NoMatch | Quit deriving (Show,Eq)
56 Data _ _ -> case rights $ map (\(p,e) -> match p v e) cases of
57 { v:_ -> v; _ -> Case v cases }
61 case p of PAnything -> return hole
62 PVar x -> return $ Let x v hole
65 Data vn vs -> if pn /= vn then Left NoMatch else
66 foldM (flip ($)) hole (zipWith match ps vs)
70 | not (x `freeIn` e2) = e2
71 | isValue e1 = Let x e1 (replace x e1 e2)
72 | otherwise = Let x e1 e2
76 Let x s e -> if x `freeIn` e2 then error "Overlapping names!" else
78 Lambda x e -> Let x e2 e
80 Var "constant" -> App (Lambda "v" (Lift (Var "v") [])) e2
81 Var "async" -> Async e2
82 Var "foldp" -> Lambda "b" . Lambda "s" $ (Fold e2 (Var "b") (Var "s"))
83 Var "lift" -> Lambda "s" (Lift e2 [Var "s"])
84 Var "lift2" -> Lambda "s1" . Lambda "s2" $ (Lift e2 [Var "s1",Var "s2"])
88simp_if (Boolean b) e2 e3 = if b then e2 else e3
89simp_if a b c = If a b c
102simp_range lo hi = toAST (parse code)
103 where toAST = either (error "Compilation Failure") (\f -> App (App f lo) hi)
104 parse str = toExpr =<< tokenize str
105 code = "let range xs lo hi = \
106 \if hi < lo then xs else range (hi:xs) lo (hi-1) in\
107 \ \\x y -> range [] x y"
109simp_binop "mod" (Number n) (Number m) = Number (mod n m)
110simp_binop "mod" e1 e2 = Binop "mod" e1 e2
112 | isAlpha (head str) || '_' == head str =
113 App (App (Var str) e1) e2
114 | otherwise = binop str e1 e2
116binop op (Number n) (Number m) = f n m
117 where f a b = case op of
118 { "+" -> Number $ (+) a b
119 ; "-" -> Number $ (-) a b
120 ; "*" -> Number $ (*) a b
121 --; "/" -> Number $ div a b
122 ; "<" -> Boolean $ a < b
123 ; ">" -> Boolean $ a < b
124 ; "<=" -> Boolean $ a <= b
125 ; ">=" -> Boolean $ a >= b
126 ; "==" -> Boolean $ a == b
127 ; "/=" -> Boolean $ a /= b
128 ; _ -> Binop op (Number n) (Number m) }
130binop "-" e (Number 0) = e
131binop "+" (Number 0) e = e
132binop "+" (Number n) (Binop "+" (Number m) e) = binop "+" (Number (n+m)) e
133binop "+" (Number n) (Binop "+" e (Number m)) = binop "+" (Number (n+m)) e
135binop "/" e (Number 1) = e
136binop "*" (Number 0) e = Number 0
137binop "*" (Number 1) e = e
138binop "*" (Number n) (Binop "*" (Number m) e) = binop "*" (Number (n*m)) e
139binop "*" (Number n) (Binop "*" e (Number m)) = binop "*" (Number (n*m)) e
141binop "+" e (Number n) = binop "+" (Number n) e
142binop "*" e (Number n) = binop "*" (Number n) e
144binop op (Boolean n) (Boolean m) = f n m
145 where f a b = case op of { "&&" -> Boolean $ (&&) n m
146 ; "||" -> Boolean $ (||) n m
147 ; _ -> Binop op (Boolean n) (Boolean m) }
149binop "&&" (Boolean True) e = e
150binop "&&" (Boolean False) e = Boolean False
151binop "||" (Boolean True) e = Boolean True
152binop "||" (Boolean False) e = e
154binop op e (Boolean n) = binop op (Boolean n) e
156binop ":" h t = cons h t
157binop "++" (Data "Nil" []) e = e
158binop "++" e (Data "Nil" []) = e
159binop "++" (Data "Cons" [h,t]) e = Data "Cons" [h, binop "++" t e]
161binop "$" e1 e2 = App e1 e2
163binop op e1 e2 = Binop op e1 e2
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list