Mercurial > repo
diff interps/rhotor/Evaluator.hs @ 996:859f9b4339e6
<Gregor> tar xf egobot.tar.xz
author | HackBot |
---|---|
date | Sun, 09 Dec 2012 19:30:08 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/interps/rhotor/Evaluator.hs Sun Dec 09 19:30:08 2012 +0000 @@ -0,0 +1,72 @@ +module Evaluator (evaluate) +where + +import Node +import Uniqs + +evaluate :: Node -> Node +evaluate x = eval x--stripBreaks (eval x) + + +eval :: Node -> Node +eval (Cons a b) = Cons (eval a) (eval b) +eval (Function a b c) = Function (eval a) (eval b) (eval c) +eval (Application (Function a b c) d) = if patternMatch a d then + eval (application a b d) + else + eval (Application c d) +eval (Application Nil _) = Nil +eval (Application (Cons a b) d) = eval (Cons (Application a d) (Application b d)) +eval (Application y@(Application _ _) d) = eval (Application (eval y) d) +eval (Application y@(Break _) d) = eval (Application (eval y) d) +eval (Break x) = eval x +eval x = x + + +stripBreaks :: Node -> Node +stripBreaks (Break a) = stripBreaks a +stripBreaks (Function a b c) = Function (stripBreaks a) (stripBreaks b) (stripBreaks c) +stripBreaks (Application a b) = Application (stripBreaks a) (stripBreaks b) +stripBreaks (Cons a b) = Cons (stripBreaks a) (stripBreaks b) +stripBreaks x = x + + + +patternMatch :: Node -> Node -> Bool +patternMatch (Symbol _) _ = True +patternMatch Nil Nil = True +patternMatch (Cons a1 d1) (Cons a2 d2) = (patternMatch a1 a2) && (patternMatch d1 d2) +-- patternMatch (Function a1 d1 c1) (Function a2 d2 c2) = (patternMatch a1 a2) && (patternMatch d1 d2) && (patternMatch e1 e2) +patternMatch a@(Application _ _ ) b = patternMatch (eval a) b +patternMatch a b@(Application _ _ ) = patternMatch a (eval a) +patternMatch (Break a) b = patternMatch a b +patternMatch a (Break b) = patternMatch a b +patternMatch _ _ = False + +application :: Node -> Node -> Node -> Node +application patrn func arg = applyList func (applicationList patrn arg) + +applyList :: Node -> [(Uniqs, Node)] -> Node +applyList (Symbol y) list = getNodeForSymbol y list +applyList (Cons a d) list = Cons (applyList a list) (applyList d list) +applyList (Function a b c) list = Function (applyList a list) (applyList b list) (applyList c list) +applyList (Application a b) list = Application (applyList a list) (applyList b list) +applyList (Break a) _ = Break a +applyList Nil _ = Nil + +getNodeForSymbol :: Uniqs -> [(Uniqs, Node)] -> Node +getNodeForSymbol s tab = case (lookup s tab) of + Just (Break a) -> Break a + Just a -> Break a + Nothing -> Symbol s + + + +applicationList :: Node -> Node -> [(Uniqs, Node)] +applicationList (Symbol y) x = [(y,x)] +applicationList Nil Nil = [] +applicationList (Cons a1 d1) (Cons a2 d2) = (applicationList a1 a2) ++ (applicationList d1 d2) +applicationList a@(Application _ _ ) b = applicationList (eval a) b +applicationList a b@(Application _ _ ) = applicationList a (eval a) +applicationList (Break a) b = applicationList a b +applicationList a (Break b) = applicationList a b