view interps/rhotor/Evaluator.hs @ 2012:c4f83ae4e77e

<olsner> addquote <fungot> but when she saw him fnord and fnord. and then there\'s the fnord, as well as fnord reading sauce with fish, or fnord, that alice quite fnord for it hadn\'t spoken before.
author HackBot
date Tue, 05 Feb 2013 23:27:58 +0000
parents 859f9b4339e6
children
line wrap: on
line source

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